如何使用SQLalchemy将CSV加载到数据库中?

时间:2019-05-16 09:28:12

标签: python csv sqlalchemy

我有一个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 :(得分:0)

我不确定速度,但这可以起作用:

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')

答案 1 :(得分:0)

在使用SQLAlchemy和Flask时,建议您使用SQLAthanor,这是SQLAlchemy的序列化库,具有Flask和Flask-SQLAlchemy的集成(完整说明:我是SQLAthanor的作者)

基本上,SQLAthanor允许您为SQLAlchemy声明性模型定义自定义序列化和反序列化规则,然后从CSV,JSON或YAML中读取数据以创建记录/实例。

documentation非常全面,确实显示了全部功能,但本质上是:

  • 您可以定义不同的规则进行序列化(输出到CSV / JSON / YAML与反序列化(从CSV / JSON / YAML中读取)),例如,出于安全目的,这些规则可能很有用
  • 从CSV读取数字或其他数据,并将其转换为适合您的数据库表示的数据类型
  • 从文件或字符串中读取
  • 在读取数据或写入数据时应用自定义预处理逻辑

鉴于上面的模型代码,下面是一个示例,说明如何从CSV中读取相应的记录:

<< flush

上面的代码所做的是,它首先创建一个支持序列化和反序列化的声明性模型类,然后遍历CSV文件的每一行并创建一个声明性模型类的实例。然后,将该实例追加到记录实例的列表中。现在,您可以像通常与任何SQLAlchemy模型实例进行交互的方式进行交互。

请注意,为了使上面的代码正常工作,您需要将SQLAthanor合并到模型定义中,这实际上非常简单。有关更多信息,请参见Using SQLAthanor

以下是相关文档的链接,您可能会发现有帮助:

希望这会有所帮助!