我有两张桌子:
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语法错误,不确定错误的位置:/
答案 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子句直接在第一个查询中指定它。