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()
- [(2, 1, 2, 1)] になる
- [(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 には対応していませんでいした。