PHPを使っていて、できて当たり前だろうと思っていたことができませんでした。どうもPythonは名前をつけて、要素と一緒に吐き出すことがデフォルトではできないらしいです。意味不明です。なので、どうやったら解決できるのか調べてみました。

prepared=Trueとdictionary=Trueをcursorで指定すると実行できない!

ひとまず、以下みたいな感じで作ってみました。


~省略~

sql='select * from python_test.sample_table limit %s'
try:
 db = mydb.connect(user=db_data.USER,password=db_data.PASSWORD,host=db_data.HOST,database=db_data.DATABASE)
 db.autocommit=False
 cursor=db.cursor(prepared=True,dictionary=True)
 cursor.execute(sql,(3,))
 data=cursor.fetchall()
 keys = cursor.column_names

~省略~

と、こんな感じ。ポイントは「prepared=True,dictionary=True」なんだけど、当然いけると思っていた。ところがエラーが出るのだ。

ちょっと海外のサイトを見てみると。。出来ないみたいなことが書いてある。しかも、代案で処理するしかないらしい

cursor.column_names を別途くっつけて対応するらしい

なんかすごいバカらしい話ですが、以下で解決できるらしいです

sql='select * from python_test.sample_table limit %s'
try:
 db = mydb.connect(user=db_data.USER,password=db_data.PASSWORD,host=db_data.HOST,database=db_data.DATABASE)
 db.autocommit=False
 cursor=db.cursor(prepared=True)
 cursor.execute(sql,(3,))
 data=cursor.fetchall()
 key=cursor.column_names
 data2=[]
 for d in data:
  data2.append(dict(zip(cursor.column_names, d)))

 print(data2)

なんていうか。。。ひどい話な気がしますね。一行ずつ、カラム名をくっつけて、配列に追記していくという、なんていうか。。。

本当にこれでいいのだろうか?他に方法があるような気がしなくもないですが、探してもこれしか見当たらないので、きっとひとまずはこれなのでしょう。

参考ページによると、python側は修正する気がないみたいなことが書いてあるような気がしますが、どうなのでしょうかね。

コメント