【问题标题】:Python SQLITE3 Insert into and On conflict do update with variables - Syntax problem?Python SQLITE3 Insert into and On conflict do update with variables - 语法问题?
【发布时间】:2021-05-12 17:38:10
【问题描述】:

我在一个在 for 循环中调用的方法中运行此代码,并将“text_body”传递给它:

*connecting to db*

cursor.execute('CREATE TABLE IF NOT EXISTS temp_data (temp_text_body text, id integer)')

cursor.execute('INSERT INTO temp_data(temp_text_body, id) VALUES (?, 1) ON CONFLICT (id) DO UPDATE '
               'SET temp_text_body = temp_text_body || (?)', (text_body, text_body))

*commiting connection*

我的目标是,第一次调用它来创建一个表并用'text_body'填充它,然后在第二次调用时添加到第一个'text_body'第二个'text_body'等等。

我尝试了此代码的许多组合,我也尝试使用 UPDATE 来实现(这很好,但 UPDATE 需要一些数据才能真正开始工作)。

当我的代码到达这个地方时,它只是停止运行,没有任何错误。有人可以告诉我我在哪里犯了错误吗?

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

    您不能在不是主键或没有“唯一约束”的字段上设置“ON CONFLICT”。这是我在运行您的代码时收到的错误消息:

    sqlite3.OperationalError: 
    ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint
    

    这实质上是因为如果该字段没有主键/唯一约束,您不能发生冲突。

    假设您希望 id 成为唯一的主键,我创建了一个有效的 sn-p:

    import sqlite3
    
    cursor = sqlite3.connect('stack_test.db')
    
    cursor.execute('''CREATE TABLE IF NOT EXISTS temp_data 
                        (temp_text_body TEXT, 
                        id INTEGER PRIMARY KEY)''')
    
    cursor.execute('''
                        INSERT INTO 
                            temp_data(temp_text_body, id) 
                        VALUES 
                            (?, 1) 
                        ON CONFLICT (id) DO UPDATE
                        SET 
                            temp_text_body = temp_text_body || (?)''',
                ("foo", "bar"))
    
    cursor.commit()
    

    我还对您编写查询语句的方式进行了一些风格上的更改,我希望这将使您更容易调试它们!

    祝 SQLite'ing 好运,如果我的答案有任何不清楚的地方,请随时询问 :)

    【讨论】:

    • 谢谢,它正在工作!我没有看到错误可能是因为 Kivy 框架。是的,您的格式看起来好多了。谢谢:)
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多