【问题标题】:how to check if a value exists in a column in sqlite 3 python如何检查sqlite 3 python中的列中是否存在值
【发布时间】:2020-08-08 23:40:36
【问题描述】:

我有一个表(server_preference),其中包含以下标题: guild_id - 整数 mod_channel_role_id - 整数 report_channel_id - 整数 我想检查 guild_id 是否存在于公会 id 列中,如果不存在我想将新员工插入表中 我尝试了很多东西,但没有找到任何有用的东西这是我最后一次尝试

conn = sqlite3.connect("server_preference.db")
    c = conn.cursor()
    for guild in client.guilds:
        c.execute("""IF NOT EXISTS ( SELECT guild_id FROM server_preference WHERE guild_id = ?)
                     BEGIN
                     INSERT INTO server_preference (guild_id) VALUES (:guild_id)
                     END""", guild.id)
        conn.commit()
    conn.close()

我得到了这个错误:

sqlite3.OperationalError:靠近“IF”:语法错误

【问题讨论】:

  • SQLite 风格的 sql 语法记录在 sqlite.org/lang.html ... 找不到以 IF 开头的命令。你不能随便乱扔东西然后希望它能起作用。

标签: python sql python-3.x sqlite sql-insert


【解决方案1】:

如果您不想在表中重复 guild_ids,那么您应该让数据库使用唯一约束或索引来强制唯一性(它们几乎是等效的)。

所以,从以下开始:

CREATE UNIQUE INDEX unq_server_preference_guild_id ON server_preference(guild_id);

然后,如果你运行:

INSERT INTO server_preference (guild_id) VALUES (:guild_id);

你会得到一个错误。如果您想避免错误,请使用ON CONFLICT 子句:

INSERT INTO server_preference (guild_id)
    VALUES (:guild_id)
    ON CONFLICT (guild_id) DO NOTHING;

【讨论】:

    【解决方案2】:

    您可以使用带有not exists 条件的insert ... select 语法在sngle 语句中实现此逻辑:

    insert into server_preference(guild_id)
    select :guild_id
    where not exists (select 1 from server_preference where guild_id = :guild_id)
    

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2022-01-21
      • 2015-01-20
      • 1970-01-01
      相关资源
      最近更新 更多