Python PYODBC INSERT - 参数太少
Python PYODBC INSERT - Too Few Parameters
我已经多次检查过这个问题,为了测试目的我已经复制了一份数据库文件,甚至重命名了该字段以匹配 Python 脚本。所以我在 Python 中使用的字段名称与 tables 字段名称完全匹配。
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 的 table,其中包含一个名为 SomeField 的字段。我有正确的路径,我已经通过 运行 a SELECT SQL 脚本验证了这一点,它可以正常工作。
我试过将 fld1 作为参数,然后用执行命令发送它,但后来我被告知我需要 0 个参数。当我删除它时,我被告知我需要 1 个。
我开始想也许是这个文件?相同的代码适用于我拥有的另一个文件。但是我创建了一个全新的文件,结果相同。我必须错过一些东西。
如果您在分配后立即print(sqlStrng)
,您会看到它的值为
INSERT INTO SomeTable (SomeField) VALUES(TestValue);
Access 数据库引擎将无法识别的名称视为参数,因此需要为 name TestValue
提供参数值。如果您想插入 字符串值 'TestValue'
那么您应该使用 pyodbc 参数占位符 (?
) 并将 val1
作为参数传递给.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
则不会出现错误,因为 123
将被视为数字文字,而不是无法识别的名称(未加引号的文本值)。
我已经多次检查过这个问题,为了测试目的我已经复制了一份数据库文件,甚至重命名了该字段以匹配 Python 脚本。所以我在 Python 中使用的字段名称与 tables 字段名称完全匹配。
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 的 table,其中包含一个名为 SomeField 的字段。我有正确的路径,我已经通过 运行 a SELECT SQL 脚本验证了这一点,它可以正常工作。
我试过将 fld1 作为参数,然后用执行命令发送它,但后来我被告知我需要 0 个参数。当我删除它时,我被告知我需要 1 个。
我开始想也许是这个文件?相同的代码适用于我拥有的另一个文件。但是我创建了一个全新的文件,结果相同。我必须错过一些东西。
如果您在分配后立即print(sqlStrng)
,您会看到它的值为
INSERT INTO SomeTable (SomeField) VALUES(TestValue);
Access 数据库引擎将无法识别的名称视为参数,因此需要为 name TestValue
提供参数值。如果您想插入 字符串值 'TestValue'
那么您应该使用 pyodbc 参数占位符 (?
) 并将 val1
作为参数传递给.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
则不会出现错误,因为 123
将被视为数字文字,而不是无法识别的名称(未加引号的文本值)。