我正在尝试遍历 sqlite3 数据库表中的所有行,并根据列变量在另一个表的列和行中输入不同的信息。
我尝试使用fetchone()
和fetchall()
以及简单的“ while True:
”进行循环-都导致了不同的错误。
下面是隔离代码的一般示例,我认为至少可以说明我正在尝试做的事情。
c.execute('SELECT * FROM {0}'.\
format(ItemPrice_table))
while True:
row = c.fetchall()
if(row == None):
break
Item = row[0]
Price = row[1]
if(Price <= 10):
Category = "Low"
if(Price > 10):
Category = "High"
if(Category == High):
c.execute("INSERT INTO {0} ({1}, {2}, {3}) VALUES ('{4}', 'Expensive' 'Red')".\
format(ItemCodes_table, Code_column0, Code_column1, Code_column2, Item))
if(Category == Low):
c.execute("INSERT INTO {0} ({1}, {2}, {3}) VALUES ('{4}', 'Cheap' 'Blue')".\
format(ItemCodes_table, Code_column0, Code_column1, Code_column2, Item))
因此,我希望它可以在“ ItemPrice_table
”中的每一行中循环,并根据价格分配一个类别,然后将该类别写入“ ItemCodes_table
”中。 >
经过几个小时的试验,我全神贯注,非常感谢我能提供的任何帮助!
答案 0 :(得分:2)
进行提取时,会列出结果列表。对于列表中的每个项目,您都将获得按选择返回顺序排列的元素。您应该将代码更改为:
c.execute('SELECT * FROM {0}'.\
format(ItemPrice_table))
data = c.fetchall()
for row in data:
Item = row[0]
Price = row[1]
if (Price <= 10):
Category = "Low"
if (Price > 10):
Category = "High"
if (Category == "High"):
c.execute("INSERT INTO {0} ({1}, {2}, {3}) VALUES ('{4}', 'Expensive' 'Red')". \
format(ItemCodes_table, Code_column0, Code_column1, Code_column2, Item))
if (Category == "Low"):
c.execute("INSERT INTO {0} ({1}, {2}, {3}) VALUES ('{4}', 'Cheap' 'Blue')". \
format(ItemCodes_table, Code_column0, Code_column1, Code_column2, Item))
我也将Category == High
更改为Category == "High"
,将Low更改为相同。如果您不使用类别,则可以这样做:
c.execute('SELECT * FROM {0}'.\
format(ItemPrice_table))
data = c.fetchall()
for row in data:
Item = row[0]
Price = row[1]
if (Price <= 10):
c.execute("INSERT INTO {0} ({1}, {2}, {3}) VALUES ('{4}', 'Cheap' 'Blue')". \
format(ItemCodes_table, Code_column0, Code_column1, Code_column2, Item))
if (Price > 10):
c.execute("INSERT INTO {0} ({1}, {2}, {3}) VALUES ('{4}', 'Expensive' 'Red')". \
format(ItemCodes_table, Code_column0, Code_column1, Code_column2, Item))
答案 1 :(得分:0)
猜想您可以使用它,并根据需要进行更改,以完成SQL所需的全部工作,而无需编写代码。
将很容易用于其他系统/语言。
INSERT INTO ItemCodes_table
SELECT
CASE WHEN Price <= 10 THEN 'low' ELSE 'high' END AS value_to_use,
'whatever should be in Code_column1',
'whatever should be in Code_column2',
item
FROM ItemPrice_Table
;
如果ItemPrice_Tables数据类似
它提供类似
的数据答案 2 :(得分:0)
最好知道您遇到的错误类型。
但是似乎fetchall
将返回一个行元组列表,您的代码将此结果视为单行。
文档(https://docs.python.org/3.7/library/sqlite3.html)建议将execute
的结果视为迭代器。
因此您可以这样做:
for row in c.execute(...):
...
代替while True
循环。