panda大学習帳外伝

勝利の方程式の解き方。

Python3でコサイン類似度を計算して、似ている記事の組を抽出してみた。 | メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


Python3でMariaDBのデータベースのテーブルから1個のカラムのデータを抽出する際にはひと手間かける必要があるというお話。

最終更新日: Mon Dec 7 21:27:51 2020 +0900

はじめに

matplotlib等を使用してヒストグラムを描く場合等に、1つの項目のデータが必要な場合があります。

そんなときに、複数のカラムからデータを取り出す例(Google先生で検索するとほとんど)からの類推で…

def get_title(conn,id):
    cur = conn.cursor()
    cur.execute("select post_title,ID from wp_posts where ID='{0:d}'".format(id))
    title = ""
    for (rec) in cur:
       title = rec 
    cur.close()
    return title

のようなコード(connはmysql.connector.connect関数で取得できるコネクションとします。以下同じ。)を書いて実行すると…

TypeError: unsupported format string passed to tuple.__format__

と返されてしまってちょっと困ったので、原因と解決策について書きます。

スポンサーリンク

原因

executeメソッド実行後のcursorからfor文で抽出結果をレコード単位(この記事のケースでは1個のデータが含まれます。)で取り出す際に、それがtupleとして取り出されてしまうのが原因です。



解決策

解決策は少なくとも2通りあります。

その1

以下のようにコードを変更することで、tupleの0番目の要素としてアクセスさせる方法です。どちらかというと正攻法です。

def get_title(conn,id):
    cur = conn.cursor()
    cur.execute("select post_title,ID from wp_posts where ID='{0:d}'".format(id))
    title = ""
    for (rec) in cur:
       title = rec[0]
    cur.close()
    return title

その2

アンダースコア(_)を「ダミー変数」的に使用する方法です。無理矢理2個の変数を指定したことにするというアプローチです。

def get_title(conn,id):
    cur = conn.cursor()
    cur.execute("select post_title,ID from wp_posts where ID='{0:d}'".format(id))
    title = ""
    for (rec,_) in cur:
       title = rec
    cur.close()
    return title

なお、上記コードの5行目の(rec,_)の括弧はなくても実行できます。

スポンサーリンク

まとめ

Google先生にお伺いを立ててみると検索されてくる例の大半は、Python3でMariaDBのデータベースのテーブルから2個以上のカラムのデータを抽出する例で、この場合は抽出するカラムの数と等しい数の変数をカンマ区切りで指定し、それらを括弧で囲むことによって、カラムの位置に対応する位置に指定された変数に値がセットされます。

しかし、変数が1個の場合にはそれに対して取り出したデータをまとめて指定できるとみなされ、結果としてデータを1個もつtupleが指定されてしまうようです。

データベースのテーブルからカラムを1個だけ指定してデータを抽出するケースはありそうでないようで、やっぱりありそうなケースである気がなんとなくしますので、ご参考にしていただけると幸いでございます。

この記事は以上です。

参考文献

リンク

Python3でコサイン類似度を計算して、似ている記事の組を抽出してみた。 | メインページ | panda大学習帳 | 第三倉庫(仮) | 用語集📒 | 本サイトについて | プライバシーポリシー


スポンサーリンク