pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

MySQL備忘録:fetchall()で取得値だけほしい。タプル、リストのカッコをはずしたい…。

PythonでMySQL…fetchall()すると[[(a,b)],…[(y,z)]]…面倒。

そもそも、結果は取得値だけです。しかし、タプル、リストのカッコに囲まれPythonデータとして成立しています。耄碌爺にはこのカッコたちが煩わしい限りです。これを何とか簡素(≠貧相)にしたいという爺の妄想です。

mysql…fetchall()すると、リスト一次配列で値だけほしいのに、取得要素複数だとタプルになりリストになる。これがヒットした回数分作られ、最後にリストで全体が括られる…。改めて値だけ取り出すのが面倒です…老害の爺にとっては…。

このスクリプトだけでは動きません:mysql接続など略)
for a_cd in cd:
  sql = f""" SELECT num, ac FROM m…(略)
  cursor.execute(sql)
  data = cursor.fetchall() # data:list
  datas.append(data)

 print(datas)

ループした結果が以下のような様子です。
[[('2338', '472.00')], [('2345', '387.00')], …[('9204', '582.00')]]


一番外側のリストは仕方ないとして、できるだけ簡素にしたい…とネット徘徊しました…。

fetchall()はそのまま使うものと思っていたけど抜け道もありそう。

fetchall()で取得した値が何重にもぐるぐる巻きになっているわけで、単に値が欲しいだけの爺には不便です…。そこで、ネット徘徊しました…。

参照記事回答の中に「fetchall()[0][0] が 133」…というのがありました。「fetchall()」のあとに「[0][0]」とひっついているではありませんか!
他にもイロイロ徘徊したんですけど、およそ「fetchall()[0][0] 」のように使う例はヒットしませんでした。

もしかして…ということで試してみました。

fetchall()[0][:] でひとつカッコが取れました。

「fetchall()」のところを「fetchall()[0][:]」に替え、動かしたら下のようになりました。
変更前の結果:[[('2338', '472.00')], [('2345', '387.00')], …]
変更後の結果:[('2338', '472.00'), ('2345', '387.00')…]
タプルのすぐ外側のカギカッコ [ ] を削除できました。いろんなやり方があるものだと爺は感服の至りでした。

この結果、列:numをkeyにした他のリストとの結合が、pandas。DataFrame.mergeででき、爺の妄想とピッタリです。mergeを実行し希望した結果を得ることができました。

おまけ:タプル内の複数値を別々に「アンパック」する方法も…。

x = ('abc', 123)
a, n = x   # アンパック
print(x)
print(a, n)
print(a)
print(n)

結果は以下のようになりました
('abc', 123)
abc 123
abc
123

これをループで回せば、リスト、配列共に独立した一次配列等に直すことができそうです。ただし、爺の都合外になるのでやってないです…。