我正在嘗試使用帶有字串串列(鏈接)的單列填充資料庫。我刮掉了串列,在將其發送到資料庫之前,我必須修改每個鏈接。這是代碼:
for event in events:
link_url = "https://www.website.com" event "#all"
c.execute("INSERT INTO table (links) VALUES(?)", link_url)
如果我修改變數并發送一個元組,我可以讓它作業,如下所示:
for event in events:
link_url = "https://www.website.com" event "#all"
link = (link_url,)
c.execute("INSERT INTO seriea (links) VALUES(?)", link_url)
但我不想使用這個解決方案,因為我想稍后得到一個字串串列:
c = connection.execute('select links from table')
list_of_urls = c.fetchall()
但這給了我一個元組串列。
這是我遇到的錯誤: ProgrammingError: 提供的系結數量不正確。當前陳述句使用 1,提供了 80 個。
我認為這是因為字串字符被計算在內(實際上更多,但我注意到“提供”之前的數字隨著鏈接的變化而變化)
uj5u.com熱心網友回復:
我不想使用此解決方案,因為我想稍后獲取字串串列:
c = connection.execute('select links from table') list_of_urls = c.fetchall()但這給了我一個元組串列。
執行選擇時獲得的元組串列與插入資料的方式無關。請記住,表格有兩個維度:
| ID | 鏈接 | 某物 | 別的 |
|---|---|---|---|
| 1 | “富” | “酒吧” | “巴茲” |
| 2 | “曲子” | “皰疹” | “德普” |
當您進行選擇時,您會得到一個與此處的行相對應的串列。但每一行都有多個欄位:id、links、something和else。串列中的每個元組都包含表中每個欄位的值。
如果您只想將 URL 作為字串串列,則可以使用串列推導或類似方法:
c = connection.execute('select links from table')
list_of_rows = c.fetchall()
list_of_strings = [row[0] for row in list_of_rows]
# ^ index of first element in
# ^^^ the tuple of values for each row
請注意,插入資料時必須提供元組或其他序列:
對于 qmark 樣式,
parameters必須是一個序列。對于命名樣式,它可以是序列或字典實體。序列的長度必須與占位符的數量匹配,否則ProgrammingError會引發 a。如果給定一個dict,它必須包含所有命名引數的鍵。
您可能以錯誤的方式思考它的元組部分。您不需要傳入 URL 元組,您需要傳入引數元組。你不是說“鏈接列應該包含這個元組”,而是“這個元組包含足夠的值來填充這個查詢中的占位符”。
我會這樣重寫:
for event in events:
link_url = "https://www.website.com" event "#all"
c.execute("INSERT INTO seriea (links) VALUES(?)", (link_url,))
這樣您就可以有多個引數,例如
c.execute(
"INSERT INTO seriea (links, some, other) VALUES(?, ?, ?)",
(link_url, foo, bar),
)
當前陳述句使用 1,提供了 80 個。
我認為那是因為字串字符被計算在內
是的,這很可能是正在發生的事情。c.execute()期望接收一個序列,而字串是一個字符序列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/422611.html
標籤:
