2016-03-27 41 views
1

我必須有一個錯誤在這裏的某個地方,但我無法找到它,而不是可怕的寫作經歷SQL ...蟒蛇sqlite3的線沒有正確評估

>>> db.c.execute('INSERT INTO {tn} ({c1n}, {c2n}) VALUES ({wn}, {f})'.\ 
... format(tn=db.table1, c1n=db.column1, c2n=db.column2, wn='someword', f=1)) 

它給我這個回溯...

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    sqlite3.OperationalError: no such column: someword 

'someword'應該是它插入的值,而不是它正在尋找的列,對不對?

回答

4

你缺少引號周圍值:

INSERT INTO {tn} ({c1n}, {c2n}) VALUES ('{wn}', '{f}') 
            HERE^ 

作爲一個側面說明,你不應該通過字符串格式化進行查詢 - 這是不是安全的,你這是你的代碼容易受到SQL injection attacks並獲得類型轉換和引用的問題(正如您已經看到的)。使用parameterized queries。不幸的是,you cannot parameterize table and column names並應單獨驗證它們;但您可以對列值進行參數替換:

db.c.execute('INSERT INTO {tn} ({c1n}, {c2n}) VALUES (:wn, :f)'.\ 
    format(tn=db.table1, c1n=db.column1, c2n=db.column2), {'wn': 'someword', 'f': 1})