我过去经常检查 stackoverflow,并且总是能够找到我一直在寻找的东西,但我似乎无法让这个工作,所以我问我的第一个问题。
我并不是一个真正的程序员,但我在工作中提到过Python,现在我有一个Python项目。实际上,我已经把一切都弄清楚了,但是将值插入数据库却让我陷入了困境。
基本问题:
我有一个使用 Python 和 tkinter 构建的表单。当按下表单上的按钮时,我希望将值插入到数据库中。
细节:
我正在使用 Python 3.4、pyodbc 和 Access 2003 数据库。
该数据库只有 1 个名为 file_info 的表,它具有以下字段,字段数据类型列在管道后面。
身份证 |自动编号
文件名 |文本
日期 |约会时间
批量数量 |数字
包裹金额 |数字
总金额 |数字
最终我想插入一些在其他函数中计算的值,但目前我只是尝试通过函数插入一些设置值,但无法让它工作。
连接字符串:
db_file = r'''C:\Users\amarquart\Documents\testlockboxdb.mdb'''
user = 'admin'
password = ''
odbc_conn_str = 'DRIVER={Microsoft Access Driver (*.mdb,
*.accdb)};DBQ=%s;UID=%s;PWD=%s' % \
(db_file, user, password)
conn = pyodbc.connect(odbc_conn_str)
cur = conn.cursor()
该程序编译并运行良好,因此我假设错误与连接字符串无关。因此,这里是我在函数中使用的一些代码示例,但无济于事。
def insert_data():
sql = '''INSERT INTO file_info
(
[ID],
[date],
[filename],
[batches_amount],
[parcels_amount],
[sum_amount],
)
VALUES
(
'1',
'test',
'8/01/2014 1:00:00 PM',
'1',
'1',
'1',
);'''
cur.execute(sql)
conn.commit()
cur.commit()
conn.close()
这给出了这个错误:
Tkinter 回调中出现异常
回溯(最近一次调用最后一次):
文件“C:\Python34\lib\tkinter__init__.py”,第 1487 行,位于call返回 self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 170 行,运行中
插入数据()
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 36 行,在 insert_data 中
cur.执行(sql)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。(-3502) (SQLExecDirectW)')
def insert_data():
sql = ("""INSERT INTO [file_info] ([ID], [date], [filename], [batches_amount],
[parcels_amount], [sum_amount])
VALUES (?, ?, ?, ?, ?, ?)""", [1, '8/01/2014 1:00:00 PM', 'test', 10, 4, 2])
cur.execute(sql)
conn.commit()
cur.commit()
conn.close()
给出这个错误:
Tkinter 回调中出现异常
回溯(最近一次调用最后一次):
文件“C:\Python34\lib\tkinter__init__.py”,第 1487 行,位于call返回 self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 154 行,运行中
插入数据()
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 20 行,在 insert_data 中
cur.执行(sql)
类型错误:要执行的第一个参数必须是字符串或 unicode 查询。
def insert_data():
sql = """
INSERT INTO file_info (ID, date, filename, batches_amount, parcels_amount, sum_amount)
VALUES (1, '8/01/2014 1:00:00 PM', 'test', 2, 2, 2)
"""
cur.execute(sql)
conn.commit()
cur.commit()
conn.close()
给出与最后一个代码相同的错误
def insert_data():
cur.execute("INSERT INTO file_info VALUES (AutoNumber, Text, Date/Time, Number,
Number, Number)",
(1, 'test', '8/01/2014 1:00:00 PM', 2, 2, 2))
conn.commit()
cur.commit()
conn.close()
给出了这个错误:
Tkinter 回调中出现异常
回溯(最近一次调用最后一次):
文件“C:\Python34\lib\tkinter__init__.py”,第 1487 行,位于call返回 self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 153 行,运行中
插入数据()
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 19 行,在 insert_data 中
(1, '测试', '8/01/2014 1:00:00 PM', 2, 2, 2))
pyodbc.ProgrammingError: ('SQL 包含 0 个参数标记,但提供了 6 个参数', 'HY000')
我猜我所尝试的一切都是极其不正确的,所以任何帮助将不胜感激。
感谢大家。
EDIT:
基于第一个响应的新尝试,唯一的区别是我使用三引号,因为代码跨越 2 行
cur.execute("""INSERT INTO file_info (ID, date, filename, batches_amount,
parcels_amount, sum_amount)
VALUES (1, 'test', '8/01/2014 1:00:00 PM', 2, 2, 2)""")
conn.commit()
给出这个错误
Tkinter 回调中出现异常
回溯(最近一次调用最后一次):
文件“C:\Python34\lib\tkinter__init__.py”,第 1487 行,位于call返回 self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 19 行,在 insert_data 中
值 (1, '测试', '8/01/2014 1:00:00 PM', 2, 2, 2)''')
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。(-3502) (SQLExecDirectW)')
params = [(1, '8/01/2014 1:00:00 PM', 'test', 2, 2, 2)]
cur.executemany("""insert into file_info(ID, date, filename, batch_amount,
parcel_amount, sum_amount)
values (?, ?, ?, ?, ?, ?)""", params)
conn.commit()
给出这个错误
Tkinter 回调中出现异常
回溯(最近一次调用最后一次):
文件“C:\Python34\lib\tkinter__init__.py”,第 1487 行,位于call返回 self.func(*args)
文件“C:/Users/amarquart/PycharmProjects/Gridtesting/Source/Gridtesting.py”,第 20 行,在 insert_data 中
值 (?, ?, ?, ?, ?, ?)""", 参数)
pyodbc.Error: ('HYC00', '[HYC00] [Microsoft][ODBC Microsoft Access Driver]未实现可选功能 (106) (SQLBindParameter)')