使用 Pyodbc 在 MS Access 表中写入新行的问题
Posted
技术标签:
【中文标题】使用 Pyodbc 在 MS Access 表中写入新行的问题【英文标题】:Issue with writing new rows in a MS Access table using Pyodbc 【发布时间】:2021-11-05 05:17:33 【问题描述】:最近我一直在尝试编写一个允许从 MS Access 数据库读取和写入信息的代码。为此,我在 Visual Studio 中使用 python 3.7 和 PIP Pyodbc。我已成功连接到数据库,并且我的 read() 函数工作正常。我的 write() 函数出现了这个问题,因为它抛出了一个错误,我不知道为什么。 write() 函数设置为从定义的类中获取变量并将这些变量写入数据库。当我运行代码时,我收到此错误。
('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。(-3502) (SQLExecDirectW)')
下面附上我的代码副本和数据库图像。 MS Access Image
import pyodbc #Opens MS Access database
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\Users\peyto\Desktop\Test Database.accdb;')
cursor = conn.cursor()
cursor.execute('select * from ToDo')
class GlobalVars(): #Variables to be taken from website
Group = ""
TaskName = ""
TaskDesc = ""
DueDate = "00000001"
DueTime = "000001"
PM = False #Will allow PM/AM to append to date in Write()
Append = False #If false will not attempt to update record
RowToAppend = ""
Delete = False
Write = False
def Read(): #Prints all values in the table
for row in cursor.fetchall():
print (row)
def Update(): #Update database row
#Code not yet tested not relevant to current issue.
cursor.execute('UPDATE ToDo'
'SET GlobalVars.Group, GlobalVars.TaskName, GlobalVars.TaskDesc, GlobalVars.DueDate, GlobalVars.DueTime'
'WHERE condition')
cursor.commit()
def Delete(): #Will delete any given row of database
print("Code not yet ready")
def Write():
if GlobalVars.PM == False:
GlobalVars.DueTime = GlobalVars.DueTime + " AM" #Concatenate AM on end of string
else:
GlobalVars.DueTime = GlobalVars.DueTime + " PM" #Concatenate PM on end of string
sql = "INSERT INTO ToDo (Group, TaskName, TaskDesc, DueDate, DueTime) VALUES (?, ?, ?, ?, ?)"
val = (GlobalVars.Group, GlobalVars.TaskName, GlobalVars.TaskDesc, GlobalVars.DueDate, GlobalVars.DueTime)
cursor.execute(sql, val)
cursor.commit()
if GlobalVars.Append == True: #Checks which function to run based on website input
Update()
elif GlobalVars.Delete == True:
Delete()
elif GlobalVars.Write == True:
Write()
Write()
Read()
【问题讨论】:
group
是关键字(例如GROUP BY
),应该用括号括起来
【参考方案1】:
字段DueDate
和DueTime
似乎是文本数据类型,因为它们是左对齐的。
将这些字段更改为 DateTime
并确保在插入时传递有效的日期和时间值 - 这意味着 GlobalVars.DueDate
和 GlobalVars.DueTime
必须包含真实的日期/时间值。
【讨论】:
以上是关于使用 Pyodbc 在 MS Access 表中写入新行的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pyodbc 执行保存在 MS Access 中的查询
如何使用 pyodbc 将表从 MS Access 迁移到 Postgres?
使用 pyodbc 将带日期的数据上传到 MS Access 数据库
使用 Pyodbc 连接到具有用户定义函数的 MS Access 文件