Динамическая вставка данных CSV в динамически создаваемые таблицы - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь динамически создавать таблицы и вставлять в них данные CSV, используя sqlAlchemy.

, учитывая набор CSV:

FirstName, LastName
Mike, Myers
Ted,Stevens

и

name, city, district
Mike, london, waterloo
Ted, london, tower bridge

У меня есть код, который создаст таблицу и столбцы на основе заголовка CSV:

import sqlalchemy
import csv
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey

with open('test.csv', 'r') as f:
    d_reader = csv.DictReader(f)
    #get fieldnames from DictReader object and store in list
    headers = d_reader.fieldnames

metadata = MetaData()

b = Table(someGeneratedName, metadata,Column('row', Integer, primary_key=True),
*(Column(n, String) for n in headers))

engine = create_engine(os.environ['DATABASE_URL'])

metadata.create_all(engine)

Как динамически вставить данные в таблицу, учитывая тот факт, что я не знаю, что столбцы таблицыесть?

Спасибо

1 Ответ

0 голосов
/ 11 мая 2019

Хотя я могу быть предвзятым автором библиотеки SQLAthanor , я бы рекомендовал использовать функцию generate_model_from_csv() SQLAthanor для автоматической генерации декларативной модели SQLAlchemy на основе вашего CSV-файла.SQLAthanor - это библиотека, разработанная для расширения SQLAlchemy с поддержкой надежных функций сериализации и десериализации.

Функция SQLAthanor generate_model_from_csv() будет считывать файл CSV и создавать модель SQLAthanor (которая наследуется от декларативной модели SQLAlchemy) на основена что он находит.Затем вы можете создать экземпляры этой модели класса записей из файла CSV, используя функцию десериализации SQLAthanor.Например:

import csv
from sqlathanor import generate_model_from_csv

MyCSVModel = generate_model_from_csv('test.csv',
                                     tablename = 'my_csv_table',
                                     primary_key = 'FirstName')

my_record_instances = []
with open('test.csv', 'r') as csv_file:
    csv_records = csv.reader(csv_file, delimiter = ',')
    for row in csv_records:
        my_instance = MyCSVModel.new_from_csv(','.join(row), 
                                              delimiter = ',')
        my_record_instances.append(my_instance)

Код, приведенный выше, сначала создает класс декларативной модели, поддерживающий сериализацию и десериализацию, а затем выполняет итерацию по каждой строке файла CSV и создает экземпляр декларативной модели.учебный класс.Затем он добавляет этот экземпляр в список экземпляров записей.Теперь вы можете взаимодействовать с этими экземплярами так же, как вы обычно взаимодействуете с любым экземпляром модели SQLAlchemy.

Вот несколько ссылок на соответствующую документацию, которая может оказаться вам полезной:

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...