使用Python将数据插入MS Access数据库
我正在尝试使用Python将值插入Microsoft Access数据库 我可以按如下方式插入值:使用Python将数据插入MS Access数据库,python,sql,ms-access,pyodbc,Python,Sql,Ms Access,Pyodbc,我正在尝试使用Python将值插入Microsoft Access数据库 我可以按如下方式插入值: df = pd.read_excel(xlsx, sheets[0]) for i in range(1, len(sheets)): data = [] data = pd.read_excel(xlsx, sheets[i]) df = df.append(data) k = (df.iat[3,0]) conn = pyodbc.connect(r'Driver=
df = pd.read_excel(xlsx, sheets[0])
for i in range(1, len(sheets)):
data = []
data = pd.read_excel(xlsx, sheets[i])
df = df.append(data)
k = (df.iat[3,0])
conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ= \\.....\Stat_tracker.accdb;')
cursor = conn.cursor()
cursor.execute("INSERT INTO ABCD (Serial) VALUES ('xxxx')")
cursor.execute('select * from ABCD')
for row in cursor.fetchall():
print(row)
我想使用循环来迭代多个记录。有更好的办法吗
当我替换光标时。用
cursor.execute("INSERT INTO ABCD (Serial) VALUES (%s)",(k,))
它会返回以下错误:
pyodbc.ProgrammingError:('42000',“[42000][Microsoft][ODBC Microsoft Access驱动程序]
查询表达式'%s'(-3100)(SQLPrepare)”中的语法错误
显然,我在使用%s
时遗漏了一些东西。也许还有另一个占位符
这应该是一个简单的修复,我只是太不熟悉语法了
帮助新手走出困境?Python的列表:
qmark
:问号样式,例如…其中name=?
numeric
:数字、位置样式,例如…其中name=:1
named
:命名样式,例如…其中name=:name
格式
:ANSI C printf格式代码,例如…其中name=%s
pyformat
:Python扩展格式代码,例如…其中name=%(name)s
大多数实现只支持一个或两个。它pyodbc
使用qmark
-样式参数,而不是格式
-样式
请尝试以下方法:
cursor.execute(“插入到ABCD(串行)值(?),(k,)
Python的列表:
qmark
:问号样式,例如…其中name=?
numeric
:数字、位置样式,例如…其中name=:1
named
:命名样式,例如…其中name=:name
格式
:ANSI C printf格式代码,例如…其中name=%s
pyformat
:Python扩展格式代码,例如…其中name=%(name)s
大多数实现只支持一个或两个。它pyodbc
使用qmark
-样式参数,而不是格式
-样式
请尝试以下方法:
cursor.execute(“插入到ABCD(串行)值(?),(k,)
考虑纯SQL查询,因为MS Access Jet/ACE引擎可以直接查询Excel工作簿。具体来说,运行insert-selectUNION
查询,避免使用panda、循环或参数
下面假设每个Excel工作表中都存在Serial
列标题,并且该列是您要循环使用的列。相应地调整
sql = """INSERT INTO ABCD (Serial)
SELECT t1.Serial
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet1$] t1
UNION ALL
SELECT t2.Serial
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet2$] t2
UNION ALL
SELECT t3.Serial
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet3$] t3
...
"""
cur.execute(sql)
考虑纯SQL查询,因为MS Access Jet/ACE引擎可以直接查询Excel工作簿。具体来说,运行insert-selectUNION
查询,避免使用panda、循环或参数
下面假设每个Excel工作表中都存在Serial
列标题,并且该列是您要循环使用的列。相应地调整
sql = """INSERT INTO ABCD (Serial)
SELECT t1.Serial
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet1$] t1
UNION ALL
SELECT t2.Serial
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet2$] t2
UNION ALL
SELECT t3.Serial
FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\Workbook.xlsx].[Sheet3$] t3
...
"""
cur.execute(sql)
可能k后面的逗号是个问题,因为只有一个参数。@June7,OP实际上是正确的,因为它是一个项的元组。OP使用了错误的占位符。对于pyodbc
,它应该是qmark,?
。请显示数据,以便我们可以看到您试图插入的内容。现在似乎只尝试了一个标量值。如果您确实需要使用pandas,那么您可能有兴趣帮助编写要访问的数据帧值。可能k后面的逗号是个问题,因为只有一个参数。@June7,OP实际上是正确的,因为它是一个项的元组。OP使用了错误的占位符。对于pyodbc
,它应该是qmark,?
。请显示数据,以便我们可以看到您试图插入的内容。目前,似乎只尝试了一个标量值。如果确实需要使用pandas,那么您可能有兴趣帮助编写要访问的数据帧值。