Мне нужно построить запрос динамического обновления для postgresql. Его динамика, потому что заранее я должен определить, какие столбцы нужно обновить.Создайте запрос динамического обновления в psycopg2
Учитывая пример таблицы:
create table foo (id int, a int, b int, c int)
Тогда я построю программно «набор» пункт
_set = {}
_set['a'] = 10
_set['c'] = NULL
После того, что я должен построить запрос на обновление. И здесь я застрял. я должен построить эту команду SQL Update:
update foo set a = 10, b = NULL where id = 1
Как сделать это с psycopg2 параметризованным команду? (т. е. зацикливание через dict, если оно не пустое и построить предложение set)?
UPDATE
Пока я спал, я нашел решение самостоятельно. Он динамичен, как именно я хотел быть :-)
create table foo (id integer, a integer, b integer, c varchar)
updates = {}
updates['a'] = 10
updates['b'] = None
updates['c'] = 'blah blah blah'
sql = "upgrade foo set %s where id = %s" % (', '.join("%s = %%s" % u for u in updates.keys()), 10)
params = updates.values()
print cur.mogrify(sql, params)
cur.execute(sql, params)
И результат, что и как мне нужно (особенно обнуляемая и цитируемая колонна):
"upgrade foo set a = 10, c = 'blah blah blah', b = NULL where id = 10"
К сожалению, я должен использовать динамический запрос, как моя реальная таблица имеет 30+ столбцов, и я только хочу, чтобы обновить те столбцы, которые имеют (если есть). И, конечно же, я должен позаботиться о столбцах варчара, которые должны быть указаны. Но я не могу автоматически указывать все значения, потому что, например, значение для столбца с нулевым значением станет «Нет» или «NULL» – Gabor
@Gabor: Я думаю, вы не понимаете, как это работает. Я отвечу позже или завтра. –
OK. Я ищу решение. Но я не хочу иметь полное количество столбцов внутри _set dict или внутри строки обновления. И, конечно же, я должен позаботиться о цитируемых столбцах, например, если бы это была нулевая колонка varchar. – Gabor