0

我对SQL不太熟悉。我有一个超过 100 列的表。将字典中的数据插入表的相应列(键名和列名相同)的最佳方法是什么?

例子:

我的 SQL 表

列 1 列 2 列 3 列 4 列 5

我从字典中获得的数据:

第一个数据集

第 2 列:苹果,第 4 列:树

第二个数据集

Column1:香蕉,Column2:蓝色,Column3:绿色,Column4:房屋,Column5:红色

因此,如果字典的键与表的列名相同,则应插入数据。我知道如何为单个查询执行此操作,但是如何为大量查询执行此操作(聪明)?

谢谢!

编辑:

我会在一个层面上做什么和一些澄清:

1) 创建一个包含所有 120 列但没有任何数据的 SQL 表。2)我有大约 500 个单词文件,其中包含应该进入数据库的部分数据(120 列中的大约 5-10 个)。3)所以我必须阅读它们,解析它们,如果字典中数据的键与 120 个列名中的任何一个匹配,则应该插入该值。3) 单模:

if key == 'Column1':

sql = INSERT INTO Column1 valuexy

这对于 500 个文件和 120 列来说当然是非常愚蠢的。我希望这更清楚。

4

2 回答 2

4

假设您有以下字典:

query_data = {
    'col1': 56,
    'col2': 100,
    'col3': 'lol'
}

您的 sql 查询可以构造如下:

sql = 'INSERT INTO table_name ({fields}) VALUES ({values})'

现在您必须构造字段字符串

fields = query_data.keys()
fields_string = ', '.join(fields)

并且对于您使用已创建的字段列表执行类似操作的值。(如果您的字典是 OrderedDict,这可以通过另一种方式完成)。

values_string = ', '.join(['"{0}"'.format(query_data[key]) for key in fields])

最后,您可以编写字符串。

composed_sql = sql.format(fields=fields_string, values=values_string)

这是一种非常粗略的方法,但如果您是该主题的新手,则非常容易理解。大多数框架都允许使用更精细的方法来实现这一点。特别是关于 SQL 注入。

打印它,玩弄,理解概念,随着时间的推移,你可能会使用其他方式。

编辑

更简洁的方法是:

sql = 'INSERT INTO table_name ({fields}) VALUES ({values})'
fields = ', '.join(query_data.keys())
values = ', '.join(['"{0}"'.format(value) for value in query_data.values()])
composed_sql = sql.format(fields=fields, values=values)
于 2013-03-28T15:14:46.300 回答
2

join()您可以使用 和 连接字典的键和值map()

d = {'Column1':'banana', 'Column2':'blue', 'Column3':'green', 'Column4':'house', 'Column5':'red'}
columns = ', '.join(map(str, d.keys()))
values = ', '.join(map(repr, d.values()))
cursor.execute("INSER INTO table ({}) VALUES ({})".format(columns, values))
于 2013-03-28T15:21:19.710 回答