sqlite3.OperationalError ...我的sqlite语法有啥问题?
Posted
技术标签:
【中文标题】sqlite3.OperationalError ...我的sqlite语法有啥问题?【英文标题】:sqlite3.OperationalError... what is wrong in my sqlite syntax?sqlite3.OperationalError ...我的sqlite语法有什么问题? 【发布时间】:2015-12-22 10:35:45 【问题描述】:Python 3 + tkinter 和 sqlite3
我正在做一个模拟应用程序来在 sqlite 中保存一段文本
功能如下:
def saveNote(self,note_id):
conn = db.connect(fname)
c = conn.cursor()
safeTitle=self.newNoteTitle.get()
safeContents=self.newNoteText.get("1.0",tk.END)
safeLink=self.newNoteLink.get()
safeRemarks=self.newNoteRemarks.get()
conn.execute('UPDATE notes SET (title,contents,remarks,link,created,last_modified,notebook_id) VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?) WHERE notes_id=5', (safeTitle, safeContents, safeRemarks, safeLink, 1))
conn.commit()
self.master.destroy()
在执行函数时,我得到这个错误:
conn.execute('UPDATE notes SET (title,contents,remarks,link,created,last_modified,notebook_id) VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, ?) WHERE notes_id=5', (safeTitle, safeContents, safeRemarks, safeLink, 1))
sqlite3.OperationalError: near "(": syntax error
我不太明白为什么语法错误...(我是 python 新手)...谁能帮我找出错误?
谢谢
【问题讨论】:
SQLite 语法图很有帮助:例如,sqlite.org/lang_update.html 和 sqlite.org/lang_insert.html 感谢您的链接,但我已经阅读了它并且我的语法似乎没问题? 您的语法有缺陷。VALUES
这个词没有出现在这个语法图中的任何地方:sqlite.org/lang_update.html (
或 )
也没有。
【参考方案1】:
我认为您的 SQL 语句不正确。根据您的解释,您希望将数据插入表中,因此您希望实际使用 INSERT 语句而不是 UPDATE。我想你可能想这样做:
INSERT INTO notes(title,contents,remarks,link,created,last_modified,notebook_id)
VALUES(INSERT_THE_VALUES_YOU_WANT_TO_INSERT_HERE)
如果您实际上是在寻找更新现有数据,那么您的语法应该如下所示:
只需在""
中填写您要设置的值
UPDATE notes
SET
title = "",
contents = "",
remarkts = "",
link = "",
created = "",
last_modified = "",
notebook_id = ""
WHERE notes_id=5
为了消除与我提供的查询的任何混淆,您希望在 Python 中像这样构造您的查询:
conn.execute('UPDATE notes SET title=?,contents=?,remarks=?,link=?,created=?,last_modified=?,notebook_id=?
WHERE notes_id=5', (safeTitle, safeContents, safeRemarks, safeLink, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1))
【讨论】:
我实际上是在更新一个已经存在的笔记..因此为什么“硬编码”note_id(我试图调试它) 那么你的更新语法不正确。我会更新我的答案。 在这种情况下,我不会使用参数,将我的代码暴露给 sql 注入! 我不知道你为什么要跳到 sql 注入。您正在尝试连接到数据库。您编写了不正确的 SQL 语法,并且为您提供了正确的语法。如果您担心 SQL 注入,那么您应该编写数据清理方法来检查每个输入。 我的意思是......你的版本当然是正确的,但它是“不同的”,因为它不使用任何参数。据我了解,最佳实践是参数化查询以使其默认安全。另外,我想了解为什么该参数化语法是错误的,而不是使用替代方法......我从这里得到的参数:#example 1 -- simple placeholders db.execute('update player set name=?, score= ?, active=? where jerseyNum=?', ('Smith, Steve', 42, True, 99))以上是关于sqlite3.OperationalError ...我的sqlite语法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
sqlite3.OperationalError ...我的sqlite语法有啥问题?
sqlite3.OperationalError:靠近“%”:语法错误
django:sqlite3.OperationalError:没有这样的表
sqlite3.OperationalError:表测试没有名为 python 的列错误