python 创建列表以通过 SQL 查询
python create list to pass through SQL query
我有这个列表
li=['beststreet','borocd','am_linkid3','bestfrom','bestto','boro','bestborost','sa18','resurf18','allpaving','nocstart','nocend','sa19','resurf19','addedbyrrm','rmmweekly']
我正在循环 shp,它是 fiona 模块 fiona.readthedocs.io/en/latest/manual.html
的有序字典
无需输入以上所有列的示例代码:
for r in shp:
sql_qry='''insert into table (beststreet,borocd) values(%s,%s)'''
values=[r['properties']['beststreet'],r['properties']['borocd']]
cur.execute(sql_qry,values)
如果我对列进行硬编码,此方法将起作用。
问题
我正在创建一个 class 方法,其中 shp 可以包含任何数量和任何列名。所以我需要弄清楚的是如何构建一个适当的列表以传递给 SQL 查询。
r['properties']
将始终在开头访问每个字段
所以理想情况下我想做这样的事情:
values= ["r['properties']["+"'"+l+"'"+"]" for l in li]
这会打印出
["r['properties']['beststreet']", "r['properties']['borocd']", "r['properties']['am_linkid3']", "r['properties']['bestfrom']", "r['properties']['bestto']", "r['properties']['boro']", "r['properties']['bestborost']", "r['properties']['sa18']", "r['properties']['resurf18']", "r['properties']['allpaving']", "r['properties']['nocstart']", "r['properties']['nocend']", "r['properties']['sa19']", "r['properties']['resurf19']", "r['properties']['addedbyrrm']", "r['properties']['rmmweekly']"]
这是无效的,但我觉得我很接近。我正在使用 python2.7
通过 psycopg2
.
访问 postgre
实例
示例 OrderedDict
shp={'properties': OrderedDict([(u'BestStreet', u'blah AV'), (u'BoroCD', 503L), (u'AM_LINKID3', 106881.0), (u'BestFrom', u'doubt it TER'), (u'BestTo', u'blah AV DEAD END'), (u'Boro', u'SI'), (u'BestBoroSt', u'SI - nuu AV'), (u'SA18', None), (u'resurf18', u'2019'), (u'AllPaving', None), (u'NOCstart', None), (u'NOCend', None), (u'SA19', u'S2305'), (u'resurf19', u'YES'), (u'addedbyRRM', None), (u'RMMweekly', None)])}
考虑一下这样操作是危险的;它可能导致各种各样的问题,让我们称之为问题..无论如何,如果您可以控制输入,假设 r
有一种检索键和值的方法(就像字典一样)我认为可以轻松实现解决方案使用这样的代码:
table = 'your_table_here'
q = 'INSERT INTO {0} ({1}) VALUES ({2});'
f = lambda x: "'{}'".format(x) if isinstance(x, str) else str(x)
for r in shp:
sql = q.format(table, ','.join(list(map(f, r.keys()))), ','.join(list(map(f, r.values()))))
cur.execute(sql)
我有这个列表
li=['beststreet','borocd','am_linkid3','bestfrom','bestto','boro','bestborost','sa18','resurf18','allpaving','nocstart','nocend','sa19','resurf19','addedbyrrm','rmmweekly']
我正在循环 shp,它是 fiona 模块 fiona.readthedocs.io/en/latest/manual.html
的有序字典无需输入以上所有列的示例代码:
for r in shp:
sql_qry='''insert into table (beststreet,borocd) values(%s,%s)'''
values=[r['properties']['beststreet'],r['properties']['borocd']]
cur.execute(sql_qry,values)
如果我对列进行硬编码,此方法将起作用。
问题
我正在创建一个 class 方法,其中 shp 可以包含任何数量和任何列名。所以我需要弄清楚的是如何构建一个适当的列表以传递给 SQL 查询。
r['properties']
将始终在开头访问每个字段
所以理想情况下我想做这样的事情:
values= ["r['properties']["+"'"+l+"'"+"]" for l in li]
这会打印出
["r['properties']['beststreet']", "r['properties']['borocd']", "r['properties']['am_linkid3']", "r['properties']['bestfrom']", "r['properties']['bestto']", "r['properties']['boro']", "r['properties']['bestborost']", "r['properties']['sa18']", "r['properties']['resurf18']", "r['properties']['allpaving']", "r['properties']['nocstart']", "r['properties']['nocend']", "r['properties']['sa19']", "r['properties']['resurf19']", "r['properties']['addedbyrrm']", "r['properties']['rmmweekly']"]
这是无效的,但我觉得我很接近。我正在使用 python2.7
通过 psycopg2
.
postgre
实例
示例 OrderedDict
shp={'properties': OrderedDict([(u'BestStreet', u'blah AV'), (u'BoroCD', 503L), (u'AM_LINKID3', 106881.0), (u'BestFrom', u'doubt it TER'), (u'BestTo', u'blah AV DEAD END'), (u'Boro', u'SI'), (u'BestBoroSt', u'SI - nuu AV'), (u'SA18', None), (u'resurf18', u'2019'), (u'AllPaving', None), (u'NOCstart', None), (u'NOCend', None), (u'SA19', u'S2305'), (u'resurf19', u'YES'), (u'addedbyRRM', None), (u'RMMweekly', None)])}
考虑一下这样操作是危险的;它可能导致各种各样的问题,让我们称之为问题..无论如何,如果您可以控制输入,假设 r
有一种检索键和值的方法(就像字典一样)我认为可以轻松实现解决方案使用这样的代码:
table = 'your_table_here'
q = 'INSERT INTO {0} ({1}) VALUES ({2});'
f = lambda x: "'{}'".format(x) if isinstance(x, str) else str(x)
for r in shp:
sql = q.format(table, ','.join(list(map(f, r.keys()))), ','.join(list(map(f, r.values()))))
cur.execute(sql)