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

Python 如何使用SQLalchemy将CSV加载到数据库中?,python,csv,sqlalchemy,Python,Csv,Sqlalchemy,我有一个大数据.csv: 还有一个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.

我有一个大数据.csv:

还有一个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读入数据库

摆设
我不确定速度,但这是可行的:

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

当您使用SQLAlchemy和Flask时,我建议您使用一个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合并到您的模型定义中,这实际上非常简单。有关详细信息,请参阅

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

在ReadTheDocs上 关于Github 文档
希望这有帮助

尝试此解决方案,它不会直接使用SQlAlchemy,但会从CSV填充数据库可能也会有所帮助:
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')
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)