Python使用pyodbc连接数据库:安装、配置与完整操作指南
本文详细讲解Python通过pyodbc库连接数据库的方法,涵盖驱动安装、64位ODBC配置及常见报错解决。通过完整代码示例演示连接、查询、参数化SQL、插入修改及提交事务等核心操作,帮助开发者高效实现数据库交互。
本文详细介绍Python利用pyodbc库访问数据库的具体操作方法。
数据库连接
在Python中连接数据库主要有两种方式:使用pyodbc或使用win32com.client。经过多次测试,唯有pyodbc成功且使用便捷,因此本文仅介绍该方法。
工具库安装
在已具备基础环境的前提下,需安装pyodbc库。请在CMD命令行窗口中执行以下命令进行安装:
pip install pyodbc
若已安装Anaconda环境,也可通过conda install pyodbc命令进行安装。
以下内容为经过测试的完整示例,供读者参考:
首先检验数据库连接是否正常。在Windows系统中,检查Python环境是否已配置Microsoft Access ODBC驱动程序的方法如下:
>>> import pyodbc >>>[x for x in pyodbc.drivers() if x.startswith('Microsoft Access Driver')]
若输出为空列表,说明当前运行的是64位Python,需安装64位版本的“ACE”驱动程序。若仅显示['Microsoft Access Driver (*.mdb)']且需使用.accdb文件,则需安装32位版本的“ACE”驱动程序。
安装64位ODBC驱动器的步骤如下:
64位ODBC驱动器的官方下载地址为 https://www.microsoft.com/en-us/download/details.aspx?id=13255 。直接安装该exe文件通常会报错,因此需先解压文件AccessDatabaseEngine_X64.exe,进入AccessDatabaseEngine_X64文件夹找到AceRedist.msi。使用Orca软件打开AceRedist.msi,定位到LaunchCondition中的BLOCKINSTALLATION行,将其删除并保存。随后再次运行AceRedist.msi即可完成64位ODBC驱动器的安装。
若觉得上述操作繁琐,可直接下载本站小编已处理好的版本。
下载地址:https://www.jb51.net/softs/695978.html
注意事项:
1、无需配置数据源。 2、Orca软件下载地址:https://www.jb51.net/softs/16217.html
以下是经过本站小编测试通过的代码示例:
该代码适用于Access 2000,理论上也可用于Access 2010。
import pyodbc
DBfile = r"F:\python\caiji.mdb" # 数据库文件需要带路径
print(DBfile)
conn = pyodbc.connect(r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+ DBfile +";Uid=;Pwd=;")
cursor = conn.cursor()
SQL = "SELECT * from sites;"
for row in cursor.execute(SQL):
print(row)
cursor.close()
conn.close()
完整测试代码
# -*-coding:utf-8-*-
import pyodbc
# 连接数据库(不需要配置数据源),connect()函数创建并返回一个 Connection 对象
cnxn = pyodbc.connect(r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\data\goods.mdb')
# cursor()使用该连接创建(并返回)一个游标或类游标的对象
crsr = cnxn.cursor()
# 打印数据库goods.mdb中的所有表的表名
print('`````````````` goods ``````````````')
for table_info in crsr.tables(tableType='TABLE'):
print(table_info.table_name)
l = crsr.execute("SELECT * from goods WHERE goodsId='0001'")# [('0001', '扇叶', 20, 'A公司', 'B公司', 2000, 2009)]
rows = crsr.execute("SELECT currentStock from goods") # 返回的是一个元组
for item in rows:
print(item)
l = crsr.execute("UPDATE users SET username='lind' WHERE password='123456'")
print(crsr.rowcount) # 想知道数据修改和删除时,到底影响了多少条记录,这个时候你可以使用cursor.rowcount的返回值。
# 修改数据库中int类型的值
value = 10
SQL = "UPDATE goods " \
"SET lowestStock=" + str(value) + " " \
"WHERE goodsId='0005'"
# 删除表users
crsr.execute("DROP TABLE users")
# 创建新表 users
crsr.execute('CREATE TABLE users (login VARCHAR(8),userid INT, projid INT)')
# 给表中插入新数据
crsr.execute("INSERT INTO users VALUES('Linda',211,151)")
''''''
# 更新数据
crsr.execute("UPDATE users SET projid=1 WHERE userid=211")
# 删除行数据
crsr.execute("DELETE FROM goods WHERE goodNum='0001'")
# 打印查询的结果
for row in crsr.execute("SELECT * from users"):
print(row)
# 提交数据(只有提交之后,所有的操作才会对实际的物理表格产生影响)
crsr.commit()
crsr.close()
cnxn.close()
1、连接数据库
1)直接连接数据库并创建游标(cursor)。
cnxn =pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')
cursor =cnxn.cursor()
2)使用DSN连接。通常DSN连接无需密码,但仍需提供PSW关键字。
cnxn =pyodbc.connect('DSN=test;PWD=password')
cursor =cnxn.cursor()
关于连接函数还有更多可选参数,详细信息可查阅pyodbc文档中的connect function和ConnectionStrings章节。
2、数据查询(SQL语句为 select ...from..where)
1)所有SQL语句均通过cursor.execute函数执行。若语句返回行(如查询语句),可通过游标的fetch函数获取数据,包括fetchone、fetchall和fetchmany。若返回空行,fetchone函数将返回None,而fetchall和fetchmany将返回空列表。
cursor.execute("select user_id, user_name from users")
row =cursor.fetchone()
if row:
printrow
2)Row类类似于元组,但支持通过字段名进行访问。
cursor.execute("select user_id, user_name from users")
row =cursor.fetchone()
print'name:', row[1] # access by column index
print'name:', row.user_name # or access by name
3)当所有行均被检索完毕后,fetchone将返回None。
while 1: row= cursor.fetchone() ifnot row: break print'id:', row.user_id
4)使用fetchall函数时,将返回剩余所有行;若为空,则返回空列表。若数据量巨大,此操作将占用大量内存。未读取的行会被压缩存储在数据库引擎中,由数据库服务器分批发送。仅读取所需行可大幅节省内存空间。
cursor.execute("select user_id, user_name from users")
rows =cursor.fetchall()
for row in rows:
printrow.user_id, row.user_name
5)若计划一次性读取所有数据,可直接遍历cursor对象本身。
cursor.execute("select user_id, user_name from users"):
for row in cursor:
printrow.user_id, row.user_name
6)由于cursor.execute返回一个cursor对象,因此可将上述语句简化为:
for row in cursor.execute("select user_id, user_name from users"):
printrow.user_id, row.user_name
7)对于多行SQL语句,单行书写可能不便,此时可使用三引号字符串进行编写:
cursor.execute("""
select user_id, user_name
from users
where last_logon < '2001-01-01'
and bill_overdue = 'y'
""")
3、参数
1)ODBC支持在SQL语句中使用问号作为参数占位符。可在SQL语句后附加值,用于传递给SQL语句中的问号。
cursor.execute("""
select user_id, user_name
from users
where last_logon < ?
and bill_overdue = ?
""",'2001-01-01','y')
这种方式比直接将值嵌入SQL语句更安全,因为每个参数是单独传递给数据库的。若使用不同参数执行相同的SQL语句,这种方式也更具效率。
3)Python DB API明确规定多参数时可使用序列传递。pyodbc同样支持该方式:
cursor.execute("""
select user_id, user_name
from users
where last_logon < ?
and bill_overdue = ?
""", ['2001-01-01','y'])
cursor.execute("select count(*) as user_count from users where age > ?",21)
row =cursor.fetchone()
print'%d users' %row.user_count
4、数据插入
1)数据插入操作,需将SQL插入语句传递给cursor的execute函数,并可附带所需参数。
cursor.execute("insert into products(id, name) values ('pyodbc', 'awesome library')")
cnxn.commit()
cursor.execute("insert into products(id, name) values (?, ?)",'pyodbc', 'awesome library')
cnxn.commit()
注意调用cnxn.commit()函数:必须调用commit函数,否则对数据库的所有操作将失效!断开连接时,所有未提交的修改将被重置。这极易导致错误,因此务必记得调用commit函数。
5、数据修改和删除
1)数据修改和删除操作与上述类似,将SQL语句传递给execute函数。我们通常关注修改或删除影响了多少条记录,此时可使用cursor.rowcount的返回值。
cursor.execute("delete from products where id <> ?",'pyodbc')
printcursor.rowcount, 'products deleted'
cnxn.commit()
2)由于execute函数总是返回cursor,因此有时也会看到如下语句:(注意rowcount置于最后)
deleted =cursor.execute("delete from products where id <> 'pyodbc'").rowcount
cnxn.commit()
同样需注意调用cnxn.commit()函数。
6、小窍门
1)既然使用单引号的SQL语句有效,那么双引号同样有效:
deleted =cursor.execute("delete from products where id <> 'pyodbc'").rowcount
2)若使用三引号,也可按以下方式使用:
deleted =cursor.execute("""
delete
from products
where id <> 'pyodbc'
""").rowcount
3)部分数据库(如SQL Server)在计数时不生成列名,此时需通过下标访问数据。也可使用“as”关键字为列命名(如下面SQL语句中的“as name-count”)。
row =cursor.execute("select count(*) as user_count from users").fetchone()
print'%s users' %row.user_count
4)若只需获取单个值,可在同一行中使用fetch函数来获取行和第一列的所有数据。
count =cursor.execute("select count(*) from users").fetchone()[0]
print'%s users' %count
若列为空,该语句将无法运行。fetchone()函数返回None,此时尝试获取下标将引发错误:NoneType不支持下标。若有默认值,通常可使用ISNULL或在SQL数据库中合并NULLs来覆盖默认值。
maxid =cursor.execute("select coalesce(max(id), 0) from users").fetchone()[0]
在此示例中,若max(id)返回NULL,coalesce(max(id),0)将导致查询结果为0。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python+MySQL数据库程序设计入门教程》、《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









