Я нашел очень хороший способ:
- чтение таблицы из базы данных sql
- переименование столбцов с помощью dict (чтение из файла yaml)
- переписать таблицу в другую базу данных
Единственная проблема заключается в том, что по мере того, как таблица становится больше (10col x несколько миллионов строк), чтение таблицы в pandas становится настолько интенсивным, чтоэто вызывает процесс, который будет убит.
Должен быть более легкий путь.Я посмотрел на операторы alter table, но они также кажутся очень сложными и не будут выполнять копирование в другой БД.Любые идеи о том, как сделать ту же операцию, не используя столько памяти.Чувство, будто панды - опора, которую я использую из-за моего плохого sql.
import pandas as pd
import sqlite3
def translate2generic(sourcedb, targetdb, sourcetable,
targettable, toberenamed):
"""Change table's column names to fit generic api keys.
:param: Path to source db
:param: Path to target db
:param: Name of table to be translated in source
:param: Name of the newly to be created table in targetdb
:param: dictionary of translations
:return: New column names in target db
"""
sourceconn = sqlite3.connect(sourcedb)
targetconn = sqlite3.connect(targetdb)
table = pd.read_sql_query('select * from ' + sourcetable, sourceconn) #this is the line causing the crash
# read dict in the format {"oldcol1name": "newcol1name", "oldcol2name": "newcol2name"}
rename = {v: k for k, v in toberenamed.items()}
# rename columns
generic_table = table.rename(columns=rename)
# Write table to new database
generic_table.to_sql(targettable, targetconn, if_exists="replace")
targetconn.close()
sourceconn.close()
Я также смотрел на такие решения, как этот , но они предполагают, что вы знаете тип столбцов.
Очень приветствуется элегантное решение.
Редактировать: Я знаю, что в sqlite существует метод, начиная с сентябрьского выпуска 3.25.0, но я застрял с версией 2.6.0