Код: Выделить всё
+----+------+------+------+
| ID | x | y | z |
+----+------+------+------+
| 1 | 1 | a | 2 |
| 2 | 1 | b | NULL |
| 3 | 1 | c | NULL |
| 4 | 2 | a | NULL |
| 5 | 2 | b | 1 |
| 6 | 2 | c | 2 |
| 7 | 3 | a | 1 |
| 8 | 3 | b | NULL |
| 9 | 3 | c | NULL |
+----+------+------+------+
< /code>
, в котором я хочу обновить значения в столбце z < /code>
на основе Pandas DataFrame < /p>
lst = [{'ID': 3, 'x': 1, 'y': 'c'},
{'ID': 4, 'x': 2, 'y': 'a'},
{'ID': 8, 'x': 3, 'y': 'b'}]
df = pd.DataFrame(lst)
[*] Приведенное значение для z - null , а
Сочетание значения для x и значение y не представлено в lipr. /> < /ol>
Это соответствует строкам 2 и 9 в таблице.
Могу ли я сделать это с одним запросом?import pandas as pd
import mysql.connector
from mysql.connector import errorcode
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
mysql_host = config['mysql']['host']
mysql_database = config['mysql']['database']
mysql_user = config['mysql']['user']
mysql_password = config['mysql']['password']
connection = mysql.connector.connect(
database = mysql_database,
host = mysql_host,
user = mysql_user,
password = mysql_password
)
cursor = connection.cursor()
values = df[['x', 'y']].values.tolist()
query = "UPDATE my_table SET z = 3 WHERE z IS NULL AND NOT (x = %s AND y = %s)"
cursor.executemany(query, values)
connection.commit()
< /code>
Это не работает: он изменяет все значения NULL < /code> на 3 < /code>.
Очевидно, coursor.executemany < /code> итерации по элементам в значениях < /code>,
, чтобы это не думает. Часть в запросе рассматривается?
и эффективно обновляя только строки 2 и 9 в таблице? Но это менее прямое. Нет ли прямого способа, где манипуляция выполняется внутри MySQL, используя запрос и DataFrame? Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/795 ... -dataframe
Мобильная версия