动态将CSV数据插入动态创建的表中

时间:2019-05-09 16:13:51

标签: python sqlalchemy

我正在尝试动态创建表,并使用sqlAlchemy将CSV数据插入其中。

提供了一组CSV:

FirstName, LastName
Mike, Myers
Ted,Stevens

name, city, district
Mike, london, waterloo
Ted, london, tower bridge

我有基于CSV标头创建表和列的代码:

import sqlalchemy
import csv
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey

with open('test.csv', 'r') as f:
    d_reader = csv.DictReader(f)
    #get fieldnames from DictReader object and store in list
    headers = d_reader.fieldnames

metadata = MetaData()

b = Table(someGeneratedName, metadata,Column('row', Integer, primary_key=True),
*(Column(n, String) for n in headers))

engine = create_engine(os.environ['DATABASE_URL'])

metadata.create_all(engine)

鉴于我不知道表列是什么,如何动态将数据插入表中?

谢谢

1 个答案:

答案 0 :(得分:0)

尽管我可能是SQLAthanor库作者的偏见,但我的建议是使用SQLAthanor的generate_model_from_csv()函数根据您的CSV文件自动生成SQLAlchemy声明性模型。 SQLAthanor是一个旨在扩展SQLAlchemy并支持强大的序列化和反序列化功能的库。

SQLAthanor generate_model_from_csv()函数将根据发现的内容读取CSV文件并构造一个SQLAthanor模型(该模型继承自SQLAlchemy的声明性模型)。然后,您可以使用SQLAthanor的反序列化功能从CSV文件中创建该模型类的记录实例。例如:

import csv
from sqlathanor import generate_model_from_csv

MyCSVModel = generate_model_from_csv('test.csv',
                                     tablename = 'my_csv_table',
                                     primary_key = 'FirstName')

my_record_instances = []
with open('test.csv', 'r') as csv_file:
    csv_records = csv.reader(csv_file, delimiter = ',')
    for row in csv_records:
        my_instance = MyCSVModel.new_from_csv(','.join(row), 
                                              delimiter = ',')
        my_record_instances.append(my_instance)

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

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

希望这会有所帮助!