Как запросить все результаты в таблице и изменить каждую строку с помощью Python - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь перебрать все строки в таблице базы данных 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 ]

2 голосов
/ 19 мая 2019

Когда вы делаете выборку, вы получаете список с вашими результатами.Для каждого элемента списка вы получаете элемент в порядке, который возвращает ваш выбор.Вы должны изменить свой код на:

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" и то же самое с низким.Но если вы не используете категорию, вы можете сделать:

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))
0 голосов
/ 19 мая 2019

Было бы хорошо узнать, какие ошибки вы получаете.Но, похоже, fetchall вернет список кортежей строк, ваш код обрабатывает этот результат как одну строку.

Документы (https://docs.python.org/3.7/library/sqlite3.html) предлагают рассматривать результат execute какитератор.

Таким образом, вы можете сделать:

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

Вместо while True цикла.

0 голосов
/ 19 мая 2019

Думаю, вы могли бы использовать это, с необходимыми изменениями, чтобы делать все, что вам нужно, все в 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 Itema 5
  • 2 Itemb 15
  • 3 Itemc 9
  • 4Itemd 11
  • 5 Iteme 3
  • 6 Itemf 20
  • 7 Itemg 17

Это дает данные типа

  • low что должно быть в Code_column1 что должно быть в Code_column2 Itema
  • high что должно быть в Code_column1 что должно быть в Code_column2 Itemb
  • low что должно быть в Code_column1 что должно быть в Code_column2 Itemc
  • high что должно быть в Code_column1 что должнобыть в Code_column2 Itemd
  • low , что должно быть в Code_column1 , что должно быть в Code_column2 Iteme
  • high whatever должен быть в Code_column1 , что должно быть в Code_column2 Itemf
  • high все, что должно быть в Code_column1 что бы ни было в Code_column2 Itemg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...