2017-10-13 82 views
-1

我想拉一個創建我需要的表的設置文件。我從此開始。使用參數時使用python3和sqlite3的語法錯誤

cursor.execute("CREATE TABLE IF NOT EXISTS measurement (time DATETIME)") 

This works。將它移動到使用參數我嘗試了許多不同的變體,但都得到大致相同的錯誤。

table_name = scrub_table_name('measurement') 
field_name = some_function1('time') 
field_type = some_function2('DATETIME') 
cursor.execute("CREATE TABLE IF NOT EXISTS {} (? ?)".format(table_name), (field_name, field_type)) 

我得到的錯誤是這個。

sqlite3.OperationalError:近「?」:語法錯誤

我得到同樣的,如果我使用的綁定版本。

cursor.execute("CREATE TABLE IF NOT EXISTS {} (:fn :ft)".format(table_name), {"fn" : field_name, "ft" : field_type}) 

我得到這個錯誤。

sqlite3.OperationalError:近 「:FFN」:語法錯誤

只是所以沒有混亂到我的問題。 顯然,我確實需要將表名移動到我自己清理並插入到字符串中,因爲sqlite執行不會接受這部分查詢的參數。因此ob.format()。雖然我會對此感興趣,但我最感興趣的是如何製作?作者:fn參數工作。 我在自制配置的Mac 10.12.6上使用Python 3.6.2和sqlite3.16.0,並不是我期望改變它,因爲我也在Debian系統上測試了相同的錯誤。

回答

1

參數化SQL表達式僅用於參數化文字值,而不是表/列名或數據類型。例如,以下是傳遞給cursor.execute()有效命令:

INSERT INTO table_name VALUES (?, ?); 
SELECT * FROM table_name WHERE column_name = ?; 
UPDATE table_name SET col1 = ? WHERE col2 = ?; 

CREATE TABLE IF NOT EXISTS table_name (? ?)並非如此,因爲與文字值替換那些?旨意總是產生一個語法無效命令。

+0

您能否解釋爲什麼我可以在第二個示例中使用表名,但不能在我的版本中使用表名?您是否也可以鏈接任何有關此文檔作爲我使用的文檔說的,否則。看[這裏](https://docs.python.org/2/library/sqlite3.html)。 「 」相反,使用DB-API的參數替換。將?作爲佔位符放在任何想要使用值的地方,然後提供一個值元組作爲遊標execute()方法的第二個參數。 – Rhett

+0

「你能解釋爲什麼我可以在第二個例子中使用表格名稱,但不能在我的版本中使用?」 - 你是指'SELECT * FROM table_name ...'例子嗎? 'table_name'沒有變量;這正是我命名示例表的原因,所以很明顯它是一個表格。關於文檔說什麼,他們確認您只能使用佔位符來獲取SQL *值*,而不是對象名稱或類型。 – jwodder

+0

對不起,我打算詢問關於列名的問題,我們都沒有將表名作爲參數傳遞,但我的列名錯誤,而不是。我不確定我是否理解我們兩種用途之間的區別,除了你們作爲選擇聲明。 – Rhett