簡體   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