アジョブジ星通信

進捗が出た頃に更新されるブログ。

New Relic のせいで MySQLdb が with 文で使えなくなったからイラっときて改造した

New Relic 便利ですが、フリートライアル期間が終わったらどこまで機能制限されるのかびくびくしてる azyobuzin です。

New Relic を導入してから MySQL-Pythonの正しい使い方 - アジョブジ星通信 の書き方をすると

Traceback (most recent call last):
File "/var/www/imgazyobuzi/api/api.py", line 160, in application return endpoint(request)
File "/var/www/imgazyobuzi/api/api.py", line 134, in all_sizes "full": resolver.get_full(match),
File "/var/www/imgazyobuzi/api/resolvers/hatena_fotolife.py", line 84, in get_full return self.work(match)["full"].replace(".flv", ".jpg")
File "/var/www/imgazyobuzi/api/resolvers/__init__.py", line 89, in work with self._connect_db() as cursor: #Connection.__enter__() で Cursor が返される
AttributeError: __exit__ 

というエラーが出るようになりました。仕方なく with を使わない書き方で応急処置したのですが、何としてでもかっこよく書きたかったので、何とかしました。

サクッと解決方法

New Relic の Python パッケージの newrelic/hooks/database_dbapi2.py とかいうモデュールで MySQLdb を上書きしているようなので、そこに __enter____exit__ を追加すればいいわけです。

というわけで、 ConnectionWrapper クラスに

def __enter__(self): return self.cursor()

def __exit__(self, exc, value, tb):
    if exc:
        self.rollback()
    else:
        self.commit()

を追加しておけば、完了です。

まったく、無駄なことしやがって。

New Relic のサポートに問い合わせたところ、そのうちなんとかしたいとのことでした。今のうちは改造して使うか、 with を諦めるかというところです。