Python PYODBC INSERT - 参数太少

时间:2017-09-12 21:40:10

标签: python-3.x ms-access pyodbc

我已经多次这样做了,我已经拿了一份数据库文件用于测试目的,甚至重命名该字段以匹配Python脚本。因此,我在Python中使用的字段名称与表字段名称完全匹配。

import pyodbc

def main():
 tble="SomeTable"
 fld1="SomeField"
 val1="TestValue"
 sqlStrng = """INSERT INTO %s (%s) VALUES(%s);""" %(tble, fld1,val1)

 contStrng = (
  r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
  r'DBQ=Some\Path\File.accdb;'
  )

 cnnctn = pyodbc.connect(contStrng)
 cursr = cnnct.cursor()

 cursr.execute(sqlStrng)

 cnnctn.commit()
 cnnctn.close()

这不是拼写问题。我已经制作了Access文件的测试副本,并创建了一个名为SomeTable的表,其中包含一个名为SomeField的字段。我有正确的路径,我通过运行SELECT SQL脚本验证了这一点,该脚本无问题。

我已尝试将fld1作为参数,然后使用execute命令发送,但随后我告知我需要0个参数。当我删除它时,我告知我需要1.

我开始想也许这个文件?相同的代码适用于我拥有的另一个文件。但是我创建了一个全新的文件,结果相同。我不得不遗漏一些东西。

1 个答案:

答案 0 :(得分:2)

如果您在分配后立即print(sqlStrng),则会看到其值为

INSERT INTO SomeTable (SomeField) VALUES(TestValue);

Access数据库引擎将无法识别的名称视为参数,因此希望为 name TestValue提供参数值。如果要插入字符串值 'TestValue',则应使用pyodbc参数占位符(?)并将val1作为{{1}中的参数传递方法,如:

.execute

请注意,如果tble="SomeTable" fld1="SomeField" val1="TestValue" sqlStrng = """INSERT INTO [%s] ([%s]) VALUES(?);""" %(tble, fld1) contStrng = ( r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=Some\Path\File.accdb;' ) cnnctn = pyodbc.connect(contStrng) cursr = cnnct.cursor() cursr.execute(sqlStrng, val1) 是一个数字字段而您使用SomeField,则不会收到错误,因为val1=123会被视为数字文字,而不是无法识别的名称(未加引号)文字值)。