Я добавляю один столбец в таблицу Postgres с более 100 столбцами через Django (новая миграция).Как я могу обновить столбец в таблице PostgreSQL данными из pandas
data_frame? псевдокод для Postgres SQL ОБНОВЛЕНИЕ будет иметь вид:
UPDATE wide_table wt
SET wt.z = df.z
WHERE date = 'todays_date'
Причина, по которой я делаю это, состоит в том, что я вычисляю столбец в data_frame
используя CSV, который находится в S3
(это df.z
).Документы для Postgres update просты в использовании, но я не уверен, как это сделать с помощью Django, sqlalchemy, pyodbc и т.п.
Прошу прощения, если это немного запутанно.Небольшой и неполный пример:
Wide Table (столбец предварительного обновления z
)
identifier | x | y | z | date
foo | 2 | 1 | 0.0 | ...
bar | 2 | 8 | 0.0 | ...
baz | 3 | 7 | 0.0 | ...
foo | 2 | 8 | 0.0 | ...
foo | 1 | 5 | 0.0 | ...
baz | 2 | 8 | 0.0 | ...
bar | 9 | 3 | 0.0 | ...
baz | 2 | 3 | 0.0 | ...
Пример фрагмента Python
def apply_function(identifier):
# Maps baz-> 15.0, bar-> 19.6, foo -> 10.0 for single date
df = pd.read_csv("s3_file_path/date_file_name.csv")
# Compute 'z' based on identifier and S3 csv
return z
postgres_query = "Select identifier from wide_table"
df = pd.read_sql(sql=postgres_query, con=engine)
df['z'] = df.identifier.apply(apply_function)
# Python / SQL Update Logic here to update Postgres Column
???
Wide Table (post-dupate column z
)
identifier | x | y | z | date
foo | 2 | 1 | 10.0 | ...
bar | 2 | 8 | 19.6 | ...
baz | 3 | 7 | 15.0 | ...
foo | 2 | 8 | 10.0 | ...
foo | 1 | 5 | 10.0 | ...
baz | 2 | 8 | 15.0 | ...
bar | 9 | 3 | 19.6 | ...
baz | 2 | 3 | 15.0 | ...
ПРИМЕЧАНИЕ. Значения в z будут меняться ежедневно, поэтому простое создание другой таблицы для хранения этих значений z
не является хорошим решением.Кроме того, я бы предпочел не удалять все данные и добавлять их обратно.