繁体   English   中英

使用 Python 将数据插入 MS Access 数据库

[英]Use Python to insert data into a MS Access Database

我正在尝试使用 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={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代码替换为

cursor.execute("INSERT INTO ABCD (Serial) VALUES (%s)",(k,))

它抛出以下错误:

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver]
查询表达式“%s”中的语法错误。 (-3100) (SQLPrepare)")

显然,我在使用%s遗漏了一些东西。 也许还有另一个占位符?

这应该是一个简单的修复,我对语法太不熟悉了。

帮助新手?

Python 的数据库 API 规范列出了几种进行参数化的方法

  • qmark : 问号样式,例如...WHERE name=?
  • numeric : 数字,位置样式,例如...WHERE name=:1
  • named : 命名样式,例如...WHERE name=:name
  • format :ANSI C printf 格式代码,例如...WHERE name=%s
  • pyformat : Python 扩展格式代码,例如...WHERE name=%(name)s

大多数实现只支持一个或两个。 看起来pyodbc使用qmark -style 参数,而不是format -style。

试试这个:

cursor.execute("INSERT INTO ABCD (Serial) VALUES (?)", (k,))

考虑一个纯 SQL 查询,因为 MS Access Jet/ACE 引擎可以直接查询 Excel 工作簿。 具体来说,运行插入-选择UNION查询,避免使用 Pandas、循环或参数。

下面假设每个 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM