pypyodbc 连接Access数据库常见报错整理

2023-05-16

pypyodbc 连接Access数据库常见报错整理

一、背景

​ 我目前用的数据库是Access,是微软旗下的一个小型数据库,有可视化界面,创建数据库跟创建一般的文件操作是一样的。创建好的数据库可以把它简单的理解成一个后缀为.odbc的文件,因为可以可视化操作,创建表也简单。所以创建库和表没必要写sql语句,不在本文描述范围内。

​ 我这个人比较懒,喜欢把数据分析工作的例事写成python脚本,每周或者每个月运行一次,自己坐在旁边摸鱼就好了。脚本的思路是用python把相关的数据从Access数据库里提取出来,然后用pandas来做数据操作,最后再把结果导出成excel或者写到其他数据库里,所以目前用到的也只是python连接数据库、表的查询、插入。代码报错本来就是一件很正常的事,我之前也会带着报错信息去百度,但是由于Access有些老了,相应的找到的帖子也比较老,本文就是整理了一下这个过程中常见的报错和解决方法。

二、pypyodbc连接Access数据库常见操作

1、连接数据库:

import pypyodbc
import pandas as pd
strs = "Driver={Microsoft Access Driver(*.mdb,*.accdb)};DBQ=文件路径"
db = pypyodbc.win_connect_mdb(strs)  # 连接数据库
cursor = db.cursor()  #创建手柄

2、数据查询:

cursor.excute("select * from [表名]") #注意这里的中括号不是代表可以不传,而是为了避免因为中文表名引起的报错
data = cursor.fecthall() #变量接受数据,此时的数据是以二维列表存储的,也没有列名
data = pd.DataFrame(data)
data.columns = [col[0] for col in cursor.description]  #cursor.description返回表的结构

cursor.excute()执行sql语句,除此之外还有cursor.excutemany() 、cursor.commit()等,大致跟pymysql差不多

3、将DataFrame数据插入数据库

cursor.executemany("insert into [表名] (字段1,字段2,字段2,...) values (?,?,?,...)",
                  data.itertuples(index=False)) #遍历data数据,并逐条插入指定表内,values值用问号?占位,问号数量与字段数量保持一致
cursor.commit()

三、常见报错

1、函数序列错误:

在这里插入图片描述

(1) 问题根源一:数据源没有配置驱动

解决方法:配置驱动

步骤:

A、打开数据源管理器:打开控制面板——>系统和安全——>管理工具——>ODBC数据源(64位)

B、添加DNS:选择用户DNS或系统DNS——>点击添加——>选择Microsoft Access Driver(.mdb,.accdb)——>完成

在这里插入图片描述

在这里插入图片描述
注:上图中几个Microsoft Access开头的驱动程序都是常见的驱动,如果你的电脑上没找到,直接百度搜索下载ODBC驱动程序,然后默认安装就可以

C、命名数据源名——>选择数据源——>在目录下面找到数据库文件所在路径,或者在数据库名下面强写数据库路径——>确定

在这里插入图片描述

在这里插入图片描述

D、剩下的就是一路确定,要修改的话就是在用户DNS那里找到对应的数据源点击配置重复步骤C

(2)问题根源二:DataFrame为空,无法遍历

解决方法:检查自己的数据,DataFrame对象有数据即可

2、不能打开数据库|应用程序可能无法识别该数据库…:

问题根源:数据库达到内存上限,Access是小型数据库,一个库的内存上限是2G左右,数据库内存接近2G的时候如果再往里面插入过多数据就会报错

解决方法:换个数据库存储

3、无效的字符值或规格:

问题根源:待插入的数据类型与表的字段类型不符,多发生于日期类、数字类字段

解决方法:打开数据库对应表的设计视图,查看数据字段类型和格式。修改DataFrame对象对应列的类型

4、无效的sql语句、语句的语法错误、语法错误 (操作符丢失) 在查询表达式

问题根源:sql语句错误,且Access支持的sql语句跟sql server也有一些细微的区别

解决问题:检查sql语句,或者写一些简单的查询语句,再由pandas来处理数据
问题根源:sql语句错误,且Access支持的sql语句跟sql server也有一些细微的区别**

解决问题:检查sql语句,或者写一些简单的查询语句,再由pandas来处理数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pypyodbc 连接Access数据库常见报错整理 的相关文章

随机推荐