SQLite3实际未插入

时间:2018-07-26 00:59:23

标签: python python-3.x sqlite

我正在尝试为管理机器人建立数据库,我使用sqlite3存储了用户收到的警告和静音的数量,我有一个名为viewpunishments的命令来显示用户收到了多少警告和静音的信息,现在显然有时用户没有警告/静音,因此我必须确保将collumn设置为0而不是NULL,但它没有设置为0,而是保持为空

conn = sqlite3.connect('levels.db')
        c = conn.cursor()
        c.execute("SELECT mute,warn FROM lvl WHERE dID=?", (guy.id,))
        selection = c.fetchone()
        print(selection)
        if selection == None:
            c.execute("UPDATE lvl SET mute=0 WHERE dID=?", (guy.id,))
            conn.commit()
            print("zero'd out the mutes")
            c.execute("UPDATE lvl SET warn=0 WHERE dID=?", (guy.id,))
            conn.commit()
            print("zero'd out the warns")
        print("update if not found")
        c.execute("SELECT warn,mute FROM lvl WHERE dID=?", (guy.id,))
        peeps = c.fetchall()
        print(peeps)

我差不多是

  1. 设置连接
  2. 查询用户是否有警告/静音
  3. 如果他们没有任何物品(请求返回null或None)
  4. 确保它为0而不是NULL
  5. 但是无论如何它总是返回null

将什么插入到已经创建的数据库中: c.execute('INSERT INTO lvl VALUES(?,?,?,?,?)', (message.author.id, 1, 1,0,0))

它是这样设置的,

  1. ID
  2. xp
  3. 级别
  4. 静音
  5. 警告

以下是与作品相同的概念的示例:

c.execute("SELECT warn FROM lvl WHERE dID=?", (guy.id,))
        print(c.fetchone())
        channel = discord.utils.get(ctx.guild.channels,id=424686228395393025) 
        if c.fetchone() == None:
            c.execute("UPDATE lvl SET warn=0 WHERE dID=?", (guy.id,))
            conn.commit()
        print("updated warns if not exist")
        c.execute("UPDATE lvl SET warn=warn+1 WHERE dID=?",(guy.id,))
        conn.commit()
        print("add warn")
        c.execute("SELECT warn FROM lvl WHERE dID=?",(guy.id,))
        warnings = c.fetchone()
        print(warnings)

上面的内容完美无误地工作了

1 个答案:

答案 0 :(得分:-1)

按照编写,此代码不会更改任何内容。不是因为您误解了UPDATE,而是因为您正在对此进行测试:

if selection == None:

但是selection是一行,由fetchone返回-其中有两个值的列表。列表永远不会等于None


如果用户根本不在数据库中,那么您可能会得到None。但是在那种情况下,UPDATE根本不需要做任何事情,因此您可以跳过所有这些代码。

但是我要假设您不是在查找不存在的用户,并且您的问题确实存在。


因此,代码的整个if部分永远不会执行。您没有得到声称要在注释中得到的输出,得到的是:

[None, None]
"update if not found"
[[None, None]]

您可能想做的是测试列表中的每个

您可能想要分别测试它们-如果warn为42但mute为NULL,则您想将mute更新为0,但保留{{1} },对吧?

此外,您应该测试warn,而不是is None

所以:

== None

有了这个小小的改动,您的代码就可以正常工作了

if selection[0] is None:
    c.execute("UPDATE lvl SET mute=0 WHERE dID=?", (guy.id,))
    conn.commit()
    print("zero'd out the mutes")
if selection[1] is None:
    c.execute("UPDATE lvl SET warn=0 WHERE dID=?", (guy.id,))
    conn.commit()
    print("zero'd out the warns")

话虽如此,也许有更好的方法来解决此问题。

您可以做的一件事是将列类型设置为[None, None] zero'd out the mutes zero'd out the warns update if not found [(0, 0)] ,并将其默认值设置为INT NONNULL,而不是默认值0。 (我认为Sqlite将忽略NULL约束,但它仍然是您意图的有用文档;默认值0是真正重要的部分。)然后,您创建的任何新行将具有NONNULL值,而不是0个值。

所有具有NULL值的现有行如何处理?让我们一口气修复它们:

NULL

现在,所有现有行都具有有效数字,并且您创建的任何新行都将具有有效数字,因此您一开始就不需要任何此代码。