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 を諦めるかというところです。