繁体   English   中英

如何在Python中的SQL查询的值列表中删除字符串的引号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM