изменение предложений SQL ОБНОВЛЕНИЕ в зависимости от данных с помощью Python - PullRequest
1 голос
/ 25 апреля 2020

Я уверен, что есть простой способ сделать это, но я не могу его найти.

Я читаю данные из файла CSV и вставляю их в некоторую таблицу SQL. Записи могут содержать данные во всех полях или нет, поэтому, если запись уже была вставлена, я хочу обновить поля, у которых есть значения, но не те, которые не имеют.

records = [
    ('123456789', '', 'smith', '', ''),
    ('123456789', '', '', '+549-11-555-9999', 'jsmith@example.com'),
    ('123456789', 'john', 'smith', '', '')]

for p in records:
    sql = "UPDATE person(name,lastname,phone,email) VALUES(%s,%s,%s,%s,%s) WHERE id=%s"
    cur.execute(sql,(p[1], p[2], p[3], p[4], p[5], p[0]))
    connection.commit()

, если я выполнив это, я получаю пустые значения в полях телефон и электронная почта человека '123456789'.

Как я могу обновить только поля со значениями?

Заранее спасибо!

Даниел //

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Вы можете поместить условные выражения в запрос UPDATE:

import itertools

sql = """
    UPDATE person
    SET name = IF(%s != '', %s, name),
        lastname = IF(%s != '', %s, lastname),
        phone = IF(%s != '', %s, phone),
        email = IF(%s != '', %s, email)
    """
for record in records:
    cur.execute(list(itertools.chain(*zip(record, record))))
connection.commit

list(itertools.chain(*zip(record, record))) необходимо для дублирования каждого элемента record.

0 голосов
/ 25 апреля 2020

Я бы предложил переписать запрос, используя стандартный синтаксис UPDATE - и вы можете добавить условные логи c.

Если вы хотите установить только столбцы, текущее значение которых null:

update person set 
    name     = coalesce(name,     %s)
    lastname = coalesce(lastname, %s)
    phone    = coalesce(phone,    %s)
    email    = coalesce(email,    %s)
where id = %s

Если вы хотите установить только столбцы, новое значение которых не равно null:

update person set 
    name     = coalesce(%s, name)
    lastname = coalesce(%s, lastname)
    phone    = coalesce(%s, phone)
    email    = coalesce(%s, email)
where id = %s

Если вы хотите обрабатывать пустые строки, а также значения null:

update person set 
    name     = coalesce(nullif(%s, ''), name)
    lastname = coalesce(nullif(%s, ''), lastname)
    phone    = coalesce(nullif(%s, ''), phone)
    email    = coalescenullif((%s, ''), email)
where id = %s
...