【问题标题】:sqlite3.OperationalError - Trying to stop duplication of resultssqlite3.OperationalError - 试图停止重复结果
【发布时间】:2017-08-02 20:42:36
【问题描述】:

我希望这段代码创建一个表并且每次只打印一个列表,而不是打印多个(之前运行时的结果)。我如何修复此代码以使 WHERE NOT EXISTS 代码真正起作用。

我的错误是:

Traceback (most recent call last):
line 33, in <module>
data_entry()
line 14, in data_entry
c.execute("INSERT INTO myTestTable VALUES('James', 45, 'Home') WHERE NOT EXISTS (SELECT 1 FROM myTestTable WHERE name ='james' AND age =45 AND address ='school')") 
sqlite3.OperationalError: near "WHERE": syntax error 

代码:

import sqlite3 

conn = sqlite3.connect('dbtest.db') 

c = conn.cursor() 

param = "School" 


def create_table():
    c.execute('CREATE TABLE IF NOT EXISTS myTestTable(name TEXT, age REAL, address TEXT)') 

def data_entry():
    c.execute("INSERT INTO myTestTable VALUES('James', 45, 'Home') WHERE NOT EXISTS (SELECT 1 FROM myTestTable WHERE name ='james' AND age =45 AND address ='school')")
    c.execute("INSERT INTO myTestTable VALUES('Jeff', 16, 'School') WHERE NOT EXISTS (SELECT 1 FROM myTestTable WHERE name ='james' AND age =45 AND address ='school')")
    c.execute("INSERT INTO myTestTable VALUES('Bob', 14, 'School') WHERE NOT EXISTS (SELECT 1 FROM myTestTable WHERE name ='james' AND age =45 AND address ='school')")
    c.execute("INSERT INTO myTestTable VALUES('Jack', 15, 'School') WHERE NOT EXISTS (SELECT 1 FROM myTestTable WHERE name ='james' AND age =45 AND address ='school')")
    conn.commit()

def query1():
    c.execute("SELECT * FROM myTestTable WHERE address = ?",(param,)) 
    while True:
        row=c.fetchone()
        if row == None:
            break
        print(row)

    c.close()
    conn.close()

create_table()

data_entry()

query1()

【问题讨论】:

  • 顺便说一句,我认为您之前的问题(及其答案)在这里让您走错了路。您仅对 james 条目进行了硬编码,因此如果您的语法正常工作,它不会阻止您复制其他条目。超出您的 3 个测试条目,这种方法将变得站不住脚。

标签: python sql python-3.x sqlite


【解决方案1】:

sqlite 不支持插入语句中的where 子句。我相信您想要做的是将unique 约束添加到表并使用insert or ignore

c.execute('CREATE TABLE IF NOT EXISTS myTestTable(name TEXT, age REAL, address TEXT, UNIQUE(name, age, address))') 

c.execute("INSERT OR IGNORE INTO myTestTable VALUES('James', 45, 'Home')")

详情见下文:

这也是一个可扩展的解决方案,避免了@raganjosh 指出的问题。但是,您可能希望以通知用户的方式处理重复。

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2022-01-17
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2021-03-14
    • 2021-09-08
    相关资源
    最近更新 更多