sqlite3 INSERT如果不存在(使用Python)

时间:2016-09-30 14:01:10

标签: python database sqlite insert

首先,我真的非常新,所以我希望我能够正确地发布这个问题。请告诉我是否有任何问题。

现在,我的问题是:我想用数据填充数据库,只有它本身不存在。我搜索了这个主题,我想我找到了正确的答案(你可以在这里阅读一个例子:["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,有时语义也不完全相同。 我希望这篇文章可以帮助将来的某个人。

2 个答案:

答案 0 :(得分:3)

首先,您需要将所有内容合并为一个self.cur.execute()调用。每次调用都必须是一个完整的查询,它们不会相互连接。

其次,您不能同时拥有VALUESSELECT作为数据源 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';
    """)

col1col2col3替换为您填写的列的实际名称。

如果任何或所有列都是表格中的唯一键,您只需使用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()您的更改!