#python #sql #database #pandas #postgresql
#python #sql #База данных #pandas #postgresql
Вопрос:
Я пытаюсь обновить table1 из копии, table2 — список столбцов.
Как мне написать команду sql для динамического обновления всех столбцов в table1 из table2 с учетом списка имен столбцов?.
Я пытаюсь избежать жесткого кодирования column1, column2 в запросе sql.
column_names = ['column1', 'column2']
# Want to make query below work automatically
# if I add another column name to `column_names`
sql_cmd = ("""
UPDATE table1
SET
table1.column1 = table2.column1,
table1.column2 = table2.column2
FROM table2
WHERE table1.id = table2.id""")
Ответ №1:
Вы можете попробовать этот вариант:
column_names = ['column1', 'column2']
sql_cmd = (""" UPDATE table1 SET table1.{} = table2.{},
table1.{} = table2.{}
FROM table2 WHERE table1.id = table2.id""").format(column_names[0], column_names[0], column_names[1], column_names[1])
print(sql_cmd)
Пример кода Jinja2 с использованием макроса:
{% macro macro_join_condition(tab_prefix_1, tab_prefix_2, columns) %}
{% for col in columns %}
{% if loop.first %}
{{ tab_prefix_1 }}{{ col }} = {{ tab_prefix_2 }}{{ col }}
{% else %}
and {{ tab_prefix_1 }}{{ col }} = {{ tab_prefix_2 }}{{ col }}
{% endif %}
{% endfor %}
{% endmacro %}
select *
from source_data sd right join target_data td on {{ macro_join_condition('td.','sd.', params.primaryKeyList) }}
Комментарии:
1. Привет, Соумендра, спасибо за это! Отличная работа. Как бы мы это сделали для количества столбцов переменной длины? Спасибо!
2. Вы можете использовать jinja2, чтобы сделать его динамичным!
3. Привет, Соумендра, можешь привести обновленный пример. Я не знаю, как это закодировать.
4. Добавлена ссылка на документ для справки:
https://towardsdatascience.com/a-simple-approach-to-templated-sql-queries-in-python-adc4f0dc511
5. Я чувствую, что есть другой способ или другие способы, которые проще с использованием SQL или python, но все в порядке, спасибо.