我有一个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()
答案 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中读取相应的记录:
<< flush
上面的代码所做的是,它首先创建一个支持序列化和反序列化的声明性模型类,然后遍历CSV文件的每一行并创建一个声明性模型类的实例。然后,将该实例追加到记录实例的列表中。现在,您可以像通常与任何SQLAlchemy模型实例进行交互的方式进行交互。
请注意,为了使上面的代码正常工作,您需要将SQLAthanor合并到模型定义中,这实际上非常简单。有关更多信息,请参见Using SQLAthanor。
以下是相关文档的链接,您可能会发现有帮助:
.new_from_csv()
文档希望这会有所帮助!