如何查询表中的所有结果并使用python修改每一行

时间:2019-05-19 08:36:07

标签: python sqlite loops select while-loop

我正在尝试遍历 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”中。 >

  • 似乎应该很简单
  • 我可以很容易地在 php 中编写这样的函数
  • 但是正如我所说的,无论我做什么我都无法使其运行

经过几个小时的试验,我全神贯注,非常感谢我能提供的任何帮助!

3 个答案:

答案 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数据类似

  • 1个意达5
  • 2个项目15
  • 3 Itemc 9
  • 4个项目11
  • 5项3
  • 6个项目20
  • 7项17

它提供类似

的数据
  • 应该在Code_column1中的所有内容 应该在Code_column2中的所有内容 Itema
  • 应该在Code_column1中的所有内容 应该在Code_column2中的所有内容 Itemb
  • 应该在Code_column1中的所有内容 应该在Code_column2中的所有内容 Itemc
  • 应放在Code_column1中的任何内容 应放在Code_column2中的所有内容 已标明
  • 应该在Code_column1中的所有内容 应该在Code_column2中的所有内容 项目
  • 应该在Code_column1中的所有内容 应该在Code_column2中的所有内容 Itemf
  • 应该在Code_column1中的所有内容 应该在Code_column2中的所有内容 Itemg

答案 2 :(得分:0)

最好知道您遇到的错误类型。 但是似乎fetchall将返回一个行元组列表,您的代码将此结果视为单行。

文档(https://docs.python.org/3.7/library/sqlite3.html)建议将execute的结果视为迭代器。

因此您可以这样做:

for row in c.execute(...):
   ...

代替while True循环。