Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@syamagami666

pymysqlのプレースホルダは数値と文字列を区別する

More than 1 year has passed since last update.

結論

Pythonでmysqlを使っていたらプレースホルダで躓いたので調べました。
結果はタイトルの通り。

直感的に数値は%dを使用しましたが、全て%sで良く、数値はクォートされずに展開されていました。

経緯

こんなコードでインサートを実行したら

import pymysql as pm
import traceback

DATABASE = {
    'host': 'localhost',
    'db': 'test',
    'user': 'root',
    'password': 'test',
    'port': 3306,
    'cursorclass': pm.cursors.DictCursor
}

con = pm.connect(**DATABASE)
try:
    with con.cursor() as cur:
        sql = """
            insert into corporation (id, name)
            values (%d, %s)
            ;
        """
        cur.execute(sql, (1,'テスト会社'))
    con.commit()
except:
    traceback.print_exc()
    con.rollback()
finally:
    con.close()

「%dは数値入れろ、文字列じゃねーよカス(意訳)」と怒られたのでインターネットをグーグルしたら
issueに回答が書いてありました。
曰く、プレースホルダは%sで良く、数値か文字列か適切に展開してくれるとのこと。
TypeError: %i format: a number is required, not str #329

Traceback (most recent call last):
  File "<ipython-input-4-84616a96211d>", line 21, in <module>
    cur.execute(sql, (1,'テスト会社'))
  File "/home/sysman/.pyenv/versions/anaconda3-5.3.1/envs/script/lib/python3.7/site-packages/pymysql/cursors.py", line 168, in execute
    query = self.mogrify(query, args)
  File "/home/sysman/.pyenv/versions/anaconda3-5.3.1/envs/script/lib/python3.7/site-packages/pymysql/cursors.py", line 147, in mogrify
    query = query % self._escape_args(args, conn)
TypeError: %d format: a number is required, not str

クエリのエスケープ処理箇所

%dとしていたところを%sに変更してデバッガで確認したら以下のように数値は数値として展開されていて、すごいなと思いました。(小学生並)

cursors.py
展開後のクエリ

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?