SQLAlchemy によってデータベースに送信された SQL コマンドをデバッグ (表示) する 質問する

SQLAlchemy によってデータベースに送信された SQL コマンドをデバッグ (表示) する 質問する

私は person テーブルをラップする Person という ORM クラスを持っています:

データベースへの接続などを設定した後、次のステートメントを実行します。

people = session.query(Person).all()

person テーブルには (まだ) データが含まれていないため、変数を印刷するとpeople空のリストが返されます。

ORM クラスで参照されるテーブルの名前を(存在しない)Peopleに変更しました。people_foo

その後、スクリプトを再度実行します。存在しないテーブルにアクセスしようとしても例外がスローされなかったことに驚きました。

そこで、次の2つの質問があります。

  1. SQLAlchemy を設定して、DB エラーをスクリプトに反映させるにはどうすればよいでしょうか?
  2. DB エンジンに送信されている SQL を表示 (つまり印刷) するにはどうすればよいでしょうか?

参考になれば幸いですが、私は PostgreSQL を使用しています。

[編集]

私はパッケージを書いています。私の__main__.pyスクリプトには、次のコードがあります (ここでは短縮されています)。

### __main__.py
import common # imports logging and defines logging setup funcs etc

logger = logging.getLogger(__name__)


def main():    
    parser = OptionParser(usage="%prog [options] <commands>",
                          version="%prog 1.0")

    commands = OptionGroup(parser, "commands")

    parser.add_option(
        "-l",
        "--logfile",
        dest="logfile",
        metavar="FILE",
        help="log to FILE. if not set, no logging will be done"
    )

    parser.add_option(
        "--level",
        dest="loglevel",
        metavar="LOG LEVEL",
        help="Debug level. if not set, level will default to low"
    )

    # Set defaults if not specified
    if not options.loglevel:
        loglevel = 1
    else:
        loglevel = options.loglevel

    if not options.logfile:
        logfilename = 'datafeed.log'
    else:
        logfilename = options.logfile

    common.setup_logger(False, logfilename, loglevel) 

       # and so on ...



        #### dbfuncs.py


import logging

    # not sure how to 'bind' to the logger in __main__.py
    logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

    engine = create_engine('postgres://postgres:pwd@localhost:port/dbname', echo=True)

[編集2]

Common モジュールはロガーを正しく設定し、common をインポートする他のモジュールでロガーを使用できます。

しかしdbfuncs、モジュールでは次のエラー/警告が表示されます。

ロガー「sqlalchemy.engine.base.Engine」のハンドラーが見つかりませんでした

ベストアンサー1

echoパラメータに加えて、create_engine()より柔軟な方法があります。loggingエンジンステートメントをエコーするように構成します。

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

見るログの設定詳細については、ドキュメントのセクションを参照してください。

おすすめ記事