2016-03-23 7 views
1

私はSQLiteとPythonで練習しています。私は、データベースプロンプトをデータベースオブジェクトとして使用してTABLEを作成しようとしています。それは非常に素晴らしい作品Pythonでsqliteテーブルをモデル化するための変数のみを使用

new_table = raw_input('Enter a table name: ') 
column = raw_input('Enter column name: ') 

cur.execute(''' CREATE TABLE IF NOT EXISTS {tn} ({col})'''\ 
    .format(tn = new_table, col = column)) 

と私はそれが直感的に見つける:いくつかの大規模な検索後、私はこの方法を見つけました(!公式ドキュメントはこの種については何も述べていない構文は、してください私を修正)。私の問題はINSERT INTO構文です。次のコードは、[OK]を動作しますが:

cur.execute("INSERT INTO {tn} ({col}) VALUES (?)", ('goodmorning')\ 
    .format(tn=new_table, col=column)) 

以下このコード、機能しません。

insdata = raw_input('Insert data for column: ') 
cur.execute("INSERT INTO {tn} ({col}) VALUES (?)", (insdata,)\ 
    .format(tn=new_table, col=column)) 

とエラーで失敗:「タプル」オブジェクトには、属性の形式を持っていません。

質問です:SQLiteのVALUESに insdata値を代入するための適切な構文は何ですか?

答えて

1

あなたは、これは少し明確なファッションで記述する場合、あなたが表示されます何が起こっているのですか:

cur.execute(
    "INSERT INTO {tn} ({col}) VALUES (?)", 
    (insdata,).format(tn=new_table, col=column) 
) 

あなたは引数のタプルをフォーマットしています。 (あなたは、関数呼び出しの中にいるので)あなたの行継続文字が全く必要とされていません。この場合

sql = "INSERT INTO {tn} ({col}) VALUES (?)".format(tn=new_table, col=column) 
cur.execute(sql, (insdata,)) 

が、場合:

cur.execute(
    "INSERT INTO {tn} ({col}) VALUES (?)".format(tn=new_table, col=column), 
    (insdata,) 
) 

または、おそらく、もう少し明確に:代わりに、あなたがしたいですオブジェクトとオブジェクトのメソッド呼び出しの間ではなく、引数の間に配置する方がはるかに意味があります。

+0

神様、私はタプルを書式設定していました...好奇心のために、中括弧で変数を使用する代わりに他の方法がありますか?そうでない場合は、上記の構文/方法はどこに文書化されていますか? dbテーブルとカラムに変数名を割り当てるこのフォーマット方法をどうやって学ぶことができましたか?そしてもちろん、このような時機を得て一貫した返答をしてくれてありがとう! – ToucHDowN

+0

@ToucHDowNデータベースに固有のものではなく、一般的な文字列書式構文です。ドキュメント[こちら](https://docs.python.org/2.7/library/string.html#format-string-syntax)信頼できないユーザー入力のデータベースで何かをすることは危険なことに注意してください。 – glibdud

+0

@glibdud参考までにありがとうございます。私はいくつかの基本的なstrメソッド(.strip/splitなど)を研究しましたが、.formatに触れていないので、上記の中括弧で囲まれたSQLステートメントは私には見えませんでした。すべて今クリア...ありがとう。 – ToucHDowN

1

私はあなたの代わりにSQLクエリを含む文字列の(1を持っていない表示される)タプルのformatメソッドを呼び出していると思う:

cur.execute("INSERT INTO {tn} ({col}) VALUES ({val})".format(tn=new_table,col=column,val='goodmorning')) 
関連する問題