首先,我真的非常新,所以我希望我能够正确地发布这个问题。请告诉我是否有任何问题。
现在,我的问题是:我想用数据填充数据库,只有它本身不存在。我搜索了这个主题,我想我找到了正确的答案(你可以在这里阅读一个例子:["Insert if not exists" statement in SQLite)但我需要在python中编写这些简单的命令行..这就是我的问题。 (我预计我在Python中也很新)
所以,这就是我所做的:
self.cur.execute("INSERT INTO ProSolut VALUES('a','b','c')")
self.cur.execute("SELECT * FROM ProSolut")
self.cur.execute("WHERE NOT EXISTS (SELECT * FROM ProSolut WHERE VALUES = ('a','b','c'))")
并且出现了错误:
[ERROR] behavior.box :_safeCallOfUserMethod:125 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1142022496:/ProSolutDB_11: Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/albehavior.py", line 113, in _safeCallOfUserMethod func(functionArg) File "<string>", line 45, in onInput_onStart OperationalError: near "WHERE": syntax error
所以基本上我认为括号中有一些问题&#34;(&#34;在第3个字符串中。 - &gt;(&#34;操作错误:接近&#34; WHERE&#34;:语法错误&#34)
我知道这可能是一个愚蠢的错误。 如果你能帮助我,我真的很感激。
非常感谢
E.G。:我忘了说我正在使用软件Choregraphe ,它使用Python语言构建所有功能块。 这意味着,即使语言基本上是Python,有时语义也不完全相同。 我希望这篇文章可以帮助将来的某个人。
答案 0 :(得分:3)
首先,您需要将所有内容合并为一个self.cur.execute()
调用。每次调用都必须是一个完整的查询,它们不会相互连接。
其次,您不能同时拥有VALUES
和SELECT
作为数据源
INSERT
查询,必须是一个或另一个。
第三,您不希望从表中选择作为数据源,因为这将为表中与WHERE
表达式匹配的每一行插入一个新行(全部或全部none,因为WHERE
表达式不引用正在选择的行中的任何内容。您只想自己选择值。
this.cur.execute("""
INSERT INTO ProSolut (col1, col2, col3)
SELECT 'a', 'b', 'c'
WHERE NOT EXISTS (SELECT * FROM ProSolut WHERE col1 = 'a', col2 = 'b', col3 = 'c';
""")
将col1
,col2
,col3
替换为您填写的列的实际名称。
如果任何或所有列都是表格中的唯一键,您只需使用INSERT OR IGNORE
:
this.cur.execute("""
INSERT OR IGNORE INTO ProSolut (col1, col2, col3)
VALUES ('a', 'b', 'c');
""");
答案 1 :(得分:3)
假设a
位于名为“Col1”的列中,b
位于“Col2”且c
位于“Col3”中,则以下内容应检查是否存在此类行:
self.cur.execute('SELECT * FROM ProSolut WHERE (Col1=? AND Col2=? AND Col3=?)', ('a', 'b', 'c'))
entry = self.cur.fetchone()
if entry is None:
print 'No entry found'
else:
print 'Entry found'
这将选择ProSolut
中与这些值匹配的所有条目。 fetchone
然后尝试获取此查询的结果 - 如果没有此类匹配,则返回None
。
编辑:根据Barmar的评论,为了使其插入值,请适应以下内容:
self.cur.execute('SELECT * FROM ProSolut WHERE (Col1=? AND Col2=? AND Col3=?)', ('a', 'b', 'c'))
entry = self.cur.fetchone()
if entry is None:
self.cur.execute('INSERT INTO ProSolut (Col1, Col2, Col3) VALUES (?,?,?)', ('a', 'b', 'c'))
print 'New entry added'
else:
print 'Entry found'
您还需要确保commit()
您的更改!