【问题标题】:sqlite3 can't get database to stay updatedsqlite3 无法让数据库保持更新
【发布时间】:2021-05-24 05:13:59
【问题描述】:

这是供不和谐机器人存储用户游戏数据的。只要机器人永远不会关闭,它就可以工作,但如果我关闭它,它会重新初始化数据库。我尝试注释掉初始用户插入,类似于注释掉创建数据库本身的方式,但这会导致第 57 行中对“行”的引用无法正常工作。

import discord
import os
import sqlite3

conn = sqlite3.connect('test.db')
print("Opened database successfully")

#CREATED DATABASE
#conn.execute('''CREATE TABLE MEMBERS
   #      (ID              INT      NOT NULL,
   #      NAME             TEXT     NOT NULL,
    #     LEVEL            INT      NOT NULL,
    #     CP               INT,
     #    CLASS            CHAR(25))''')
#print ("Table created successfully")

#INSERT USER
conn.execute("INSERT INTO MEMBERS (ID,NAME,LEVEL,CP,CLASS) \
      VALUES (229039794787713025, 'Solumn', 125, 5525391, 'Mage')");
conn.execute("INSERT INTO MEMBERS (ID,NAME,LEVEL,CP,CLASS) \
      VALUES (624678639778267136, 'SacredPugsly', 0, 0, 'None')");
conn.execute("INSERT INTO MEMBERS (ID,NAME,LEVEL,CP,CLASS) \
      VALUES (159985870458322944, 'Noxis', 124, 10, 'Huntard')");

bot = discord.Client()

@bot.event
async def on_ready():
    guild_count = 0
  
    for guild in bot.guilds:
        print(f"- {guild.id} (name: {guild.name})")

        guild_count = guild_count + 1

    print("AlienBot is in " + str(guild_count) + " servers.")
  
  
def check(message):
  try:
    int(message.content)
    return True
  except ValueError:
    return False

@bot.event
async def on_message(message):
    #debug to check user ID'set
    print(message.author.id)

    if message.content.startswith('!show'):
        #SELECT USER
        cursor = conn.execute("SELECT * from MEMBERS WHERE id=?", (message.author.id,))
        for row in cursor:
          print ("ID = ", row[0])

        response = discord.Embed(title=row[1],color=0x3498db)
        response.add_field(name="Level", value=row[2], inline=False)
        response.add_field(name="CP", value=row[3], inline=False)
        response.add_field(name="Class", value=row[4], inline=False)

        await message.channel.send(embed=response)

    if message.content.startswith('!updatecp'):
      await message.channel.send("Enter your CP")
      cp = await bot.wait_for('message',timeout = 60, check=check)
      attempt = int(cp.content)
      cursor = conn.execute("UPDATE MEMBERS SET cp=? WHERE id=?", (int(attempt),message.author.id)) 

    if message.content.startswith('!updatelevel'):
      await message.channel.send("Enter your Level")
      lvl = await bot.wait_for('message',timeout = 60, check=check)
      attempt = int(lvl.content)
      cursor = conn.execute("UPDATE MEMBERS SET LEVEL=? WHERE id=?", (attempt, message.author.id))   

    if message.content.startswith('!help'):
      response = discord.Embed(title='Bot Commands',color=0x3498db)
      response.add_field(name="!updatecp", value='Allows you to adjust your CP', inline=False)
      response.add_field(name="!updatelevel", value='Allows you to adjust your level', inline=False)
      response.add_field(name="!show", value='Shows you your character data', inline=False)

      await message.channel.send(embed=response)
#conn.close()

from dotenv import load_dotenv
load_dotenv()

bot.run(os.getenv("DISCORD_TOKEN"))```

【问题讨论】:

    标签: python sqlite discord


    【解决方案1】:

    您似乎从未commit您的书面数据。在插入后执行conn.commit() 或将您的连接isolation_level 设置为None

    Documentation

    【讨论】:

    • 非常感谢文档链接,将isolation_level 插入到None 允许我取出初始成员插入并正确更新数据!
    猜你喜欢
    • 2013-11-23
    • 2020-09-14
    • 2018-08-23
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多