Менее ресурсоемкий способ копирования таблиц и переименования столбцов в sqlite / pandas - PullRequest
0 голосов
/ 14 декабря 2018

Я нашел очень хороший способ:

  1. чтение таблицы из базы данных sql
  2. переименование столбцов с помощью dict (чтение из файла yaml)
  3. переписать таблицу в другую базу данных

Единственная проблема заключается в том, что по мере того, как таблица становится больше (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

1 Ответ

0 голосов
/ 14 декабря 2018

Чтобы уточнить мои комментарии ...

Если у вас есть таблица в foo.db и вы хотите скопировать данные этой таблицы в новую таблицу в bar.db с разными именами столбцов:

$ sqlite3 foo.db
sqlite> ATTACH 'bar.db' AS bar;
sqlite> CREATE TABLE bar.newtable(newcolumn1, newcolumn2);
sqlite> INSERT INTO bar.newtable SELECT oldcolumn1, oldcolumn2 FROM main.oldtable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...