Python:flask-sqlalchemy 填充 table 使用 csv 作为源而不列出 table 的每一列

Python: flask-sqlalchemy fill table using csv as source without listing every column of table

我想首先声明我知道这个网站上有很多类似的问题,解决方案确实有效,我的问题是,至少我能找到的都是类似这样的问题的变体:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class Example(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    Column1 = db.Column(db.String(100))
    Column2 = db.Column(db.String(100))
    Column3 = db.Column(db.String(100))

import csv

with open("source_file.csv") as f:
    reader = csv.reader(f)
    next(reader)
    for i in reader:
        new_entry = Example(
        Column1 = i[0],
        Column2 = i[1],
        Column3 = i[2])
        db.session.add(new_entry)
        db.session.commit()

这行得通,但它有几个问题,例如,如果有问题的 table 有 n 列,我需要写 nx2 行,一次定义 table和第二个填写table.

的内容

这对于小型 tables 来说还可以,但是如果您使用的 tables 有 100 多个列,这会变得非常快。 此外,如果由于任何原因 table 结构发生一点点变化,就无法维护。

所以,我正在寻求帮助以获得更好的方法,如果这仍然是一个重复的问题,我深表歉意并仅寻求指导,我找到了解决方案,但仅适用于 SQLAlchemy,当我在 FlaskSQlAlchemy 中尝试了它们。

假设 source_file.csv header 项目与 table 中的列名称相同,您可以这样做:

import csv

with open("source_file.csv") as f:
    reader = csv.reader(f)
    header = next(reader)
    for i in reader:
        kwargs = {column: value for column, value in zip(header, i)}
        new_entry = Example(**kwargs)
        db.session.add(new_entry)
        db.session.commit()

您还可以检查 header 项是否存在于列集中:

columns = [column.key for column in Example.__table__.columns]
kwargs = {header_item: value for header_item, value in zip(header, i) if column in columns}