Python 如何使用SQLalchemy将CSV加载到数据库中?
我有一个大数据.csv: 还有一个SQLAlchemy模型: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.
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)