使用Python将数据插入MS 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=

我正在尝试使用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("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-select
UNION
查询,避免使用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-select
UNION
查询,避免使用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,那么您可能有兴趣帮助编写要访问的数据帧值。