【问题标题】:I cannot SELECT a recent INSERT to my database unless I stop and restart my program除非我停止并重新启动程序,否则我无法选择最近的 INSERT 到我的数据库
【发布时间】:2020-10-06 08:29:59
【问题描述】:

当我运行我的代码时,我试图将一些信息插入到我的数据库中,然后使用 SELECT 调用该信息。当我手动检查数据库时,我可以看到新条目。正在插入该条目,但我的 python 代码在我退出并重新运行它之前看不到它。

这些是通过异步机器人调用的(下面未显示)。但同样的事情发生在下面的自包含代码中。您会注意到一些过度使用提交,因为我读过一些人们在选择之前成功提交的地方,但它不起作用。

我在这里找到了几个与此问题有关的问题,但他们的解决方案似乎都不适用于我。

编辑:如果从代码本身不清楚,这些是将掷骰子添加到数据库中,然后根据纪元日期和条目数返回它们。

import sqlite3, time
from datetime import datetime

def add_roll(user=None, nick=None, argument=None, equation=None, result=None, stat=None, success=None, comment=None):
    conn = sqlite3.connect('dicebot.db')
    c = conn.cursor()

    sql = "INSERT INTO rolls (messagetime, user, nick, argument, equation, result, stat, success, comment) VALUES (?,?,?,?,?,?,?,?,?)"
    values = (time.time(), user, nick, argument, equation, result, stat, success, comment)
    c.execute(sql,values)
    conn.commit()    
    conn.close()

def get_entry(date_in_epoch=0, date_out_epoch=time.time(), number_of_entries=1):
    conn = sqlite3.connect('dicebot.db')
    c = conn.cursor()
    conn.commit()

    select_stmt = '''SELECT * FROM rolls ORDER BY messagetime DESC LIMIT (%s)''' % (number_of_entries,)

    if number_of_entries == -1:
        select_stmt = '''SELECT * from rolls WHERE messagetime BETWEEN (%s) and (%s) ORDER BY messagetime''' % (date_in_epoch, date_out_epoch)
    elif number_of_entries >= 0:
        select_stmt = '''SELECT * from rolls WHERE messagetime BETWEEN (%s) and (%s) ORDER BY messagetime DESC LIMIT (%s)''' % (date_in_epoch, date_out_epoch, number_of_entries)

    x = c.execute(select_stmt)
    records = x.fetchall()

    output = []
    for record in records:
        nick = record[3]
        equation = record[5]
        result = record[6]
        stat = record[7]
        success = record[8]
        comment = "" if record[9] is None else record[9]

        if success is not None:
            output.append("**{}:** {} {} {} (Stat={})".format(nick, result, success, comment, stat))
        else:
            output.append("**{}:** {} {}".format(nick, result, comment))

    conn.close()
    return output


if __name__ == '__main__':
    add_roll("MyName", "MyHandle", "1d6+2", "(3)+2", 5, 45, None)
    for record in get_entry(number_of_entries=10):
        print (record)

【问题讨论】:

  • 表中messagetime的类型是什么?

标签: python python-3.x sqlite


【解决方案1】:

问题出在date_out_epoch 的默认值。

def get_entry(date_in_epoch=0, date_out_epoch=time.time(), number_of_entries=1):

在定义函数时计算默认值,而不是每次调用函数时。由于您在调用函数时没有为此参数指定值,因此您只能看到在定义 get_entry() 之前创建的行,即加载脚本时。

如果您将以后的代码更改为:

    for record in get_entry(number_of_entries=10, date_out_epoch = time.time()):
        print (record)

你会看到所有的新行。

要让get_entry() 实现你想要的默认值,你可以这样定义:

def get_entry(date_in_epoch=0, date_out_epoch=None, number_of_entries=1):
    if date_out_epoch is None:
        date_out_epoch = time.time()
    ...

【讨论】:

  • 你刚刚为我回答了多个问题哈哈。我遇到了我认为使用不同代码集的不同问题,但这绝对是同一个问题。谢谢!
  • 默认值的不当使用会导致很多问题。更常见的见stackoverflow.com/questions/1132941/…
猜你喜欢
  • 2016-11-18
  • 2020-06-22
  • 2022-01-18
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多