首先,我真的是 super 新手,所以我希望我能够正确地发布问题。如果有任何问题,请告诉我。
现在,这是我的问题:我想用数据填充数据库,前提是数据库中尚不存在该数据。我搜索了这个主题,我想我找到了正确的答案(你可以在这里阅读一个例子:[ "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
所以基本上我认为第三个字符串中的括号“(”存在一些问题。--> (“OperationalError: near “WHERE”: syntax error”)
我知道这可能是一个愚蠢的错误。 如果你能帮助我,我将不胜感激。
非常感谢
E.G.: 忘了说我用的是软件Choregraphe,它使用Python语言来构建所有的功能 block 。 这意味着,即使语言基本上是 Python,有时语义也不完全相同。 我希望这篇文章能对以后的人有所帮助。
最佳答案
首先,您需要将所有内容组合到单个 self.cur.execute()
调用中。对此的每次调用都必须是一个完整的查询,它们不会相互连接。
其次,您不能同时将 VALUES
和 SELECT
作为数据源
INSERT
查询,它必须是其中之一。
第三,您不想从表中选择作为数据源,因为这将为表中与 WHERE
表达式匹配的每一行插入一个新行(这是all 或 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');
""");
关于python - sqlite3 如果不存在则插入(使用 Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39793327/