Как я могу загрузить CSV в базу данных с помощью SQLalchemy? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть large-data.csv:

id,foo,bar,column1,column2
1,"abc",0,"gh",42
2,"xy",1,"bla",1337

и модель SQLAlchemy:

class Asset(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    abc = db.Column(db.String)
    foo = db.Column(db.String)  # not in CSV
    bar = db.Column(db.Boolean)
    column1 = db.Column(db.String)
    column2 = db.Column(db.Integer)

Как я могу прочитать CSV в базу данных?

Настройкавсе наверх

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__, template_folder='templates')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)


class Asset(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    abc = db.Column(db.String)
    foo = db.Column(db.String)  # not in CSV
    bar = db.Column(db.Boolean)
    column1 = db.Column(db.String)
    column2 = db.Column(db.Integer)

db.create_all()

Ответы [ 2 ]

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

Поскольку вы используете SQLAlchemy и Flask, я бы предложил использовать SQLAthanor , библиотеку сериализации для SQLAlchemy с интеграциями для Flask и Flask-SQLAlchemy (полное описание: я являюсь авторомSQLAthanor)

По сути, SQLAthanor позволяет вам определять пользовательские правила сериализации и десериализации для ваших декларативных моделей SQLAlchemy, а затем читать данные из CSV, JSON или YAML для создания записей / экземпляров.

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

  • вы можете определить различные правила для сериализации (вывод в CSV /JSON / YAML против десериализации (чтение из CSV / JSON / YAML), которая может быть полезна в целях безопасности, например
  • чтение числовых или других данных из CSV и преобразование их в соответствующие типы данных для представления вашей базы данных
  • чтение из файлов или строк
  • применение настраиваемой логики предварительной обработки при повторномдобавление данных или запись данных

Учитывая приведенный выше код вашей модели, вот пример того, как вы можете читать соответствующие записи из CSV:

import csv

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

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

Обратите внимание, что для правильной работы приведенного выше кода вам нужно будет включить SQLAthanor в определение модели, котороена самом деле довольно легко.Для получения дополнительной информации см. Использование SQLAthanor .

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

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

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

Я не уверен насчет скорости, но это работает:

import pandas as pd

engine = db.get_engine()  # db is the one from the question
csv_file_path = 'large-data.csv'

# Read CSV with Pandas
with open(csv_file_path, 'r') as file:
    df = pd.read_csv(file)

# Insert to DB
df.to_sql('users',
          con=engine,
          index=False,
          index_label='id',
          if_exists='replace')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...