在Sqlite和python中对表中的项运行检查

2024-06-01 08:26:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个表格:

----------
Items  | QTY
----------
sugar  | 14
mango  | 10
apple  | 50
berry  | 1

----------
Items  |QTY
----------
sugar  |10
mango  |5
apple  |48
berry  |1

我使用python中的以下查询检查表1和表2的数量之间的差异

 cur = conn.cursor()
    cur.execute("select s.Items, s.qty - t.qty as quantity from Stock s join Second_table t on s.Items = t.Items;")
    remaining_quantity = cur.fetchall()

我有点纠结于如何去做我需要完成的事情。我需要检查表1和表2的数量之间的差异,如果数量(差异)小于5,那么对于那些项目,我希望能够将其存储在另一个表列中,值为1,如果不是,那么这些项目的值将为0。我该怎么办

编辑:

我尝试过这样做,通过循环行,如果列值小于5,则使用以下值插入到新表中:

 for row in remaining_quantity:
        print(row[1])
        if((row[1]) < 5):
            cur.execute('INSERT OR IGNORE INTO check_quantity_tb VALUES (select distinct s.Items, s.qty, s.qty - t.qty as quantity, 1 from Stock s join Second_table t on s.Items = t.Items'), row)
        print(row)

但是我得到一个SQL语法错误,不确定错误可能在哪里:/


Tags: appleexecute数量items差异sugarselectquantity
1条回答
网友
1楼 · 发布于 2024-06-01 08:26:53

首先修改第一个查询,以便检索所有相关信息,而不必在以后发出子查询:

readcursor = conn.cursor()
readcursor.execute(
  "select s.Items, s.qty, s.qty - t.qty as remain " 
  "from Stock s join Second_table t on s.Items = t.Items;"
  )

然后使用它更新第三个表:

writecursor = conn.cursor()
for items, qty, remain in readcursor:
    print(remain)

    if remain < 5:
        writecursor.execute(
           'INSERT OR IGNORE INTO check_quantity_tb VALUES (?, ?, ?, ?)', 
            (items, qty, remain, 1) 
            )

conn.commit() 

注意以下几点:

1/我们使用两个不同的游标,这样我们可以在第一个游标上迭代,同时使用第二个游标写入。这避免了在内存中获取所有结果,这对于大型数据集来说是一个真正的节约

2/当在第一个游标上迭代时,我们将行解压为各自的组成部分。这称为“元组解包”(但实际上适用于大多数序列类型):

>>> row = ("1", "2", "3")
>>> a, b, c = row
>>> a
'1'
>>> b
'2'
>>> c
'3'

3/我们让db api模块对要插入的值进行适当的清除和转义。这避免了转义/引用等带来的麻烦,并保护您的代码免受SQL注入攻击(这里可能没有,但这是用Python编写参数化查询的正确方法)

注意:由于您没有发布完整的表定义或明确的规范,甚至没有完整的错误消息和回溯,因此我只将您的代码片段翻译成更合理的内容(避免使用代价高昂且无用的子查询,因为它可能是导致错误的原因)。我不能保证它会开箱即用,但至少它会让你回到正轨

NB2:您提到必须根据remain值将最后一列设置为1或0。如果是这种情况,您希望您的循环是:

writecursor = conn.cursor()
for items, qty, remain in readcursor:
    print(remain)

    flag = 1 if remain < 5 else 0
    writecursor.execute(
           'INSERT OR IGNORE INTO check_quantity_tb VALUES (?, ?, ?, ?)', 
            (items, qty, remain, flag) 
            )

conn.commit() 

如果您只想处理保留的行<;5,您可以在第一个查询中使用where子句直接指定它

相关问题 更多 >