我正在尝试动态创建表,并使用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)
鉴于我不知道表列是什么,如何动态将数据插入表中?
谢谢
答案 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模型实例进行交互的方式进行交互。
以下是相关文档的链接,您可能会发现有帮助:
generate_model_from_csv()
文档.new_from_csv()
文档希望这会有所帮助!