ニクニクドットミー

カッコいいおっさんを目指すエンジニアの厳かなブログ

pythonのMySQLdbのクエリをprintしてみた

前回、「バルクインサートとインサートで処理速度を比較してみた」を書いたのですが、 これを見てくれた先輩が、「executemanyが実際どんなSQLを吐いているのか見れるといいですね」と感想を言ってくれました。

うーんなるほど。

MySQLdbにどんなクエリが流れたか確認するようなメソッドは無い(たぶん)ので、ライブラリを覗いてみました。

まずMySQLdbを探します。 pipで入れたライブラリはsite-packagesにあります。

そこの辿り方はこちらを「pipでインストールしたパッケージはsite-packagesにある」

クエリを吐いているコードを抜粋。 cursors.pyの306行目

def _do_query(self, q):
    # ここでprint
    print q
    db = self._get_db()
    self._last_executed = q
    db.query(q)
    self._do_get_result()
    return self.rowcount

引数のqには整形されたクエリが渡ってくるので、それをprint。

こちらがexecutemanyを実行したときのクエリ。

INSERT INTO address(id, ad1, ad2, ad3) VALUES
('1', '\"0600000\"', '\"北海道\"', '\"札幌市中央区\"'),
('2', '\"0640941\"', '\"北海道\"', '\"札幌市中央区\"'),
('3', '\"0600041\"', '\"北海道\"', '\"札幌市中央区\"'),
('4', '\"0600042\"', '\"北海道\"', '\"札幌市中央区\"'),
('5', '\"0640820\"', '\"北海道\"', '\"札幌市中央区\"'),
('6', '\"0600031\"', '\"北海道\"', '\"札幌市中央区\"'),
('7', '\"0600001\"', '\"北海道\"', '\"札幌市中央区\"'),
('8', '\"0640821\"', '\"北海道\"', '\"札幌市中央区\"'),
('9', '\"0600032\"', '\"北海道\"', '\"札幌市中央区\"'),
('10', '\"0600002\"', '\"北海道\"', '\"札幌市中央区\"')

バルクインサートになってますね。

感想

ライブラリを覗いてコードリーディングするといろいろと発見がありました。 例えばこれ

def _query(self, q): return self._do_query(q)

単純にreturnするメソッドであれば、一行にしています。

スマートっちゃあスマートかもしれませんが、僕はあまり見られない書き方だなーと。 今度から真似してみようかな(笑)

あと普段から使っているライブラリがどういう処理をしているのか理解も深まるかなーと思いました。 コードリーディングは素晴らしいですね。