![](/img/trans.png)
[英]How to remove string quotations, commas and parenthesis from Python itertools output?
[英]How to remove quotations of string in list of values for sql query in python
我想在python中使用SQL将值插入表open.roads中,该表具有以下列:
id integer NOT NULL DEFAULT nextval('open.res_la_roads_id_seq'::regclass),
run_id integer,
step integer,
agent integer,
road_id integer,
CONSTRAINT res_la_roads_pkey PRIMARY KEY (id)
我试图在一个查询中将各种值的行写入sql,因此,按照以下示例,我创建了一个列表,其中包含要在查询中插入的值:
INSERT INTO open.roads(id, run_id, step, agent, road_id)
VALUES (DEFAULT, 1000, 2, 2, 5286), (DEFAULT, 1000, 1, 1, 5234);
Python中的列表应包含:
list1=(DEFAULT, 1000, 2, 2, 5286), (DEFAULT, 1000, 1, 1, 5234), (.....
我的值“ DEFAULT”有问题,因为它是一个字符串,应该在sql中引入而不使用引号 。 但是我无法删除引号,我试图将“ DEFAULT”保存为字符串形式的变量,并使用了str.remove(),str.replace()等。
我尝试使用的代码:
for road in roads:
a="DEFAULT", self.run_id, self.modelStepCount, self.unique_id, road
list1=append.(a)
val=','.join(map(str, list1))
sql = """insert into open.test ("id","run_id","step","agent","road_id")
values {0}""".format(val)
self.model.mycurs.execute(sql)
由于出现引号,我得到一个错误:
psycopg2.DataError: invalid input syntax for integer: "DEFAULT"
LINE 2:('DEFAULT', 582, 0, 2, 13391),('DEFAULT'
如何删除它们? 还是有其他方法可以做到这一点?
我认为这可能对您有帮助。
sql = "INSERT INTO open.roads(id, run_id, step, agent, road_id) VALUES "
values = ['(DEFAULT, 1000, 2, 2, 5286), ', '(DEFAULT, 1000, 1, 1, 5234)']
for value in values:
sql += value
print(sql)
运行此代码后,它将打印: INSERT INTO open.roads(id, run_id, step, agent, road_id) VALUES (DEFAULT, 1000, 2, 2, 5286), (DEFAULT, 1000, 1, 1, 5234)
其他解决方案是使用%
格式化字符串。
print("INSERT INTO open.roads(id, run_id, step, agent, road_id) VALUES (%s, %s, %s, %s, %s)" % ("DEFAULT", 1000, 2, 2, 5286))
这将打印INSERT INTO open.roads(id, run_id, step, agent, road_id) VALUES (DEFAULT, 1000, 2, 2, 5286)
只需在追加查询中省略该列,因为根据您的表约束,该列将提供DEFAULT值。 另外,通过在execute
传递vars参数来使用值的参数化(比字符串插值更安全/更可维护): execute(query, vars)
。 并且由于您有一个元组列表,因此甚至可以考虑executemany()
。
下面假设数据库API(即pymysql,pyscopg2)使用%s
作为参数占位符,否则使用?
:
# PREPARED STATEMENT
sql = """INSERT INTO open.test ("run_id", "step", "agent", "road_id")
VALUES (%s, %s, %s, %s);"""
list1 = []
for road in roads:
a = (self.run_id, self.modelStepCount, self.unique_id, road)
list1.append(a)
self.model.mycurs.executemany(sql, list1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.