2017-09-25 58 views
1

我正在学习SQL炼金术。我有一个来自CSV文件的列名列表。我想为每一行创建插入语句(或者为所有行插入一个插入语句)。到目前为止,我有创建一个插入对象

with open('tablename.csv', 'r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 

    for data in reader: 
     query = insert(table(table_name), columns, data) 
     print(str(query)) 

这只是打印

INSERT INTO tablename() VALUES() 

在CSV文件中的每一行。

如何正确提供列名和值?

回答

2

原因编译INSERT语句是空的是两件事情引起的:在light weight table construct你用过没有columns定义, 前3个参数来insert()是表,values和在线 - 不表,列和值。在遇到麻烦时,阅读相关文档是一个好的开始。

SQLAlchemy插入结构可以使用passing it to execute, accompanied with the desired values,也可以作为单个INSERT ... VALUES ...语句使用。无论哪种方式,如果不通过全表元组你要通过列的字典,值对:

tbl = table(table_name, *(column(c) for c in columns)) 
values = [dict(zip(columns, data)) for data in reader] 

# A single INSERT statement with multiple values 
stmt = insert(tbl).values(values) 
engine.execute(stmt) 

# More traditional executemany 
engine.execute(insert(tbl), values) 
+0

我今天要消化大量SQLAlchemy的文档中。所以我可以只指定列名并可以省略它们的类型? –

+0

''[阅读器]中的数据([zip(列,数据))是否必须是一个列表或它可以是一个生成器? –

+0

对于你的第一个问题,当使用轻量级的'table()'和'column()'构造'type_'时,并不一定需要,如果你传递了适当的值,DB-API驱动程序可以以产生可转换为列类型和/或所讨论类型的SQL不需要特殊的绑定/ SQL处理。 –