2016-04-26 11 views
1

[OK]をので、基本的に、私はインスタンス変数(標準およびLVL)私は今、私は基本的に問題を知っているSQLite3アップデートでインスタンス変数を使用していますか?

sqlite3.OperationalError: no such column: typ 

を取得していますエラーとして

#Set variables 
typ = 'Test' 
lvl = 6 

#Print Databse 
print("\nHere's a listing of all the records in the table:\n") 
for row in cursor.execute("SELECT rowid, * FROM fieldmap ORDER BY rowid"): 
    print(row) 

#Update Info 
sql = """ 
UPDATE fieldmap 
SET buildtype = typ, buildlevel = lvl 
WHERE rowid = 11 
""" 

cursor.execute(sql) 

#Print Databse 
print("\nHere's a listing of all the records in the table:\n") 
for row in cursor.execute("SELECT rowid, * FROM fieldmap ORDER BY rowid"): 
    print(row) 

で既存のSQLite3のデータベースを更新しようとしています私の変数は誤った構文で挿入されていますが、私の人生は正しいものを見つけることができません。すぐに私はそれがエラーをスロー変数に切り替えるよう

sql = """ 
UPDATE fieldmap 
SET buildtype = 'house', buildlevel = 3 
WHERE rowid = 11 
""" 

しかし:それはこのようにうまく文字列とint型で動作します。

答えて

2

実際にはクエリ文字列に変数typlvlの値が挿入されていません。書かれているように、クエリはtyplvlという名前の列を参照しようとしていますが、これらはテーブルに存在しません。

てみ書き込みがパラメータ化クエリの通りです:

sql = """ 
UPDATE fieldmap 
SET buildtype = ?, buildlevel = ? 
WHERE rowid = 11 
""" 

cursor.execute(sql, (typ, lvl)) 

​​に渡されたタプルの値に置き換えられ、クエリ文字列内のプレースホルダとして機能し?。これは、クエリを構築する安全な方法であり、SQLインジェクションの脆弱性を回避します。

-1

こんにちは私はSQLデータベースを操作するためにORMを使うべきだと思います。

SQLAlchemyはあなたの友人です。私はそれをSQLite、MySQL、PostgreSQLで使用します。これは素晴らしい。

これは、SQLではカンマと引用符が重要なので、この構文エラーから離れることがあります。

ハードコーディングするために、あなたはこれを試すことがあります。これは、長期のために一時的にではなく、あなたの問題を解決することができ

sql = """ 
UPDATE fieldmap 
SET buildtype = '%s', buildlevel = 3 
WHERE rowid = 11 
""" % (house) 

。 ORMはあなたの友人です。

これは役に立ちます。

+0

申し訳ありませんが、私は見てみましょう! – Syntic

+0

**決してデータベースに渡されるSQLコマンドで '%s'ま​​たは' str.format'を使用しないでください。それはSQLインジェクションになりがちです。 – aim100k

+0

@ aim100kはい、わかっています。そのため、ハードコーディングの代わりにORMを使用しています。しかし、注射について大部分を気にしている人は、SQLAlchemyを使用する以外に、独自のSQL ORMを実行します。 – dotslash

関連する問題