我正在尝试为管理机器人建立数据库,我使用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)
我差不多是
将什么插入到已经创建的数据库中:
c.execute('INSERT INTO lvl VALUES(?,?,?,?,?)', (message.author.id, 1, 1,0,0))
它是这样设置的,
以下是与作品相同的概念的示例:
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)
上面的内容完美无误地工作了
答案 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
现在,所有现有行都具有有效数字,并且您创建的任何新行都将具有有效数字,因此您一开始就不需要任何此代码。