使用 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)
我正在尝试使用 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)