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

时间:2018-01-17 14:18:53

标签: python sqlite

我有两张桌子:

 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)

我在python中使用以下查询来检查表一和表二的QTY之间的差异。

{{1}}

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

编辑:

我尝试过循环遍历行,如果列值小于5,则使用下面的值插入新表。 :

{{1}}

但是我得到一个SQL语法错误,不确定错误的位置:/

1 个答案:

答案 0 :(得分:0)

首先修改您的第一个查询,以便检索所有相关信息,并且不必在以后发布子查询:

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 /当迭代第一个游标时,我们将行解包到它们各自的组件中。这被称为&#34;元组解包&#34; (但实际上适用于大多数序列类型):

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

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

注意:既然您没有发布完整的表定义也没有明确说明 - 甚至没有完整的错误消息和追溯 - 我只将您的代码片段翻译成更合理的内容(避免使用昂贵且无用的子查询, migh 或不是导致错误的原因)。我不能保证它会开箱即用,但至少它应该让你重回轨道。

NB2:你提到你必须根据remain值将最后一个col设置为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() 

如果您只想处理剩余的行&lt; 5,您可以使用where子句直接在第一个查询中指定它。