LoginSignup
1
0

More than 5 years have passed since last update.

Python で SQLITE3 の Parameterized query のパラメータを渡す順序

Last updated at Posted at 2017-12-16

CodeIQ 「進捗まあまあマーク」問題 闇落ち解答版 作成中に躓いたこと。

さて、python 3.6 で次のコードの最後の実行結果はどうなるでしょう?

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> strSQL = 'SELECT :1, :2, :1;'
>>> conn.execute(strSQL,(1,2)).fetchall()
[(1, 2, 1)]
>>> strSQL = 'SELECT :2,:1, :2, :1;'
>>> conn.execute(strSQL,(1,2)).fetchall()
  1. [(2, 1, 2, 1)] になる
  2. [(1, 2, 1, 2)] になる

・・・

>>> strSQL = 'SELECT :2,:1, :2, :1;'
>>> conn.execute(strSQL,(1,2)).fetchall()
[(1, 2, 1, 2)]

正解は 2 でした。

しかし、ドキュメントを当たってみた。
PEP 249 -- Python Database API Specification v2.0

numeric | Numeric, positional style, e.g. ...WHERE name=:1

positional ってところが :1, :2 がパラメータの順序と対応することを期待しているのではないかなと思うがどうなんだろ?

バージョンが上がったら挙動が変わるかもしれない。

なお、postgreSQL に接続する psycopg2 、mysql に接続する mysql-connector-python-rf はどちらもこの numeric paramstyle には対応していませんでいした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0