使用 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]
Syntax error in query expression '%s'. (-3100) (SQLPrepare)")

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

应该是一个简单的修复,我对语法太陌生了。

帮助新手?

Python的Database API Specification lists several ways of doing parametrization:

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

大多数实现只支持一个或两个。它 looks like pyodbc 使用 qmark 样式参数,而不是 format 样式。

试试这个:

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

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

下面假定 Serial 列 header 存在于每个 Excel sheet 中,并且是您打算循环的列。相应调整。

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)