sqlite3 如果不存在则插入(使用 Python)

mru*_*cco 3 python database sqlite insert

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

现在,这是我的问题:我想用数据填充数据库,前提是它不存在于其中。我搜索了这个主题,我想我找到了正确的答案(你可以在这里阅读一个例子:[ 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'))")
Run Code Online (Sandbox Code Playgroud)

这是错误:

[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  
Run Code Online (Sandbox Code Playgroud)

所以基本上我认为第三个字符串中的括号“(”存在一些问题。--> ("OperationalError: near "WHERE": syntax error")

我知道这可能是一个愚蠢的错误。如果你能帮助我,我将不胜感激。

非常感谢


EG:我忘了说我使用的是软件 Choregraphe,它使用 Python 语言构建所有功能块。这意味着,即使语言基本上是 Python,有时语义也不完全相同。我希望这篇文章可以在未来帮助某人。

Bar*_*mar 7

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

其次,您不能同时拥有VALUESSELECT作为INSERT查询中的数据源 ,它必须是其中之一。

第三,您不想从表中选择作为数据源,因为这将为表中与WHERE表达式匹配的每一行插入一个新行(要么全部要么没有,因为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';
    """)
Run Code Online (Sandbox Code Playgroud)

替换col1col2col3与你在填充柱的实际名称。

如果任何或所有列是表中的唯一键,您可以使用INSERT OR IGNORE

this.cur.execute("""
    INSERT OR IGNORE INTO ProSolut (col1, col2, col3)
    VALUES ('a', 'b', 'c');
    """);
Run Code Online (Sandbox Code Playgroud)


aso*_*uin 5

假设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'
Run Code Online (Sandbox Code Playgroud)

这将选择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'
Run Code Online (Sandbox Code Playgroud)

你也需要确保你commit()的改变!