[解決済み] SQLAlchemy が db に送る SQL コマンドのデバッグ(表示)
2022-05-17 10:43:47
質問
PersonというORMクラスがあり、人物テーブルをラップしています。
データベースへの接続などを設定した後、私はこのステートメントを実行します。
people = session.query(Person).all()
person テーブルには (まだ) データが含まれていないので、変数を表示すると
people
を表示すると、空のリストが表示されます。
ORMクラスで参照されているテーブルの名前を変更しました。
People
に、そして
people_foo
(これは存在しない)に変更します。
次に、スクリプトをもう一度実行してみました。存在しないテーブルにアクセスしようとしても、例外が投げられないことに驚きました。
したがって、私は以下の2つの質問があります。
- SQLAlchemy が 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
モジュールでは、次のようなエラー/警告が表示されます。
logger "sqlalchemy.engine.base.Engineのハンドラが見つかりませんでした。
どのように解決するのですか?
に加えて
echo
のパラメータは
create_engine()
を設定することで、より柔軟に対応できます。
logging
を設定してエンジンステートメントをエコーさせることです。
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
参照 ログの設定 のセクションを参照してください。
関連
-
[解決済み] SQLの "LIKE "ステートメントと同等のSQLAlchemy
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] 作業ディレクトリを変更するシェル 'cd' コマンドに相当するものですか?
-
[解決済み] SQLAlchemy: flush() と commit() の違いは何ですか?
-
[解決済み】コマンドラインから関数を実行する
-
[解決済み】Flask-SQLAlchemyアプリで生のSQLを実行する方法
-
[解決済み】SQLAlchemy:実際のクエリを表示する
-
[解決済み] Python で、クラスオブジェクトを dict にキャストするにはどうしたらいいですか?
-
[解決済み] 集合からランダムな選択? python
-
[解決済み] デバッグモードでFlaskが2回初期化されないようにするには?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ヒストグラム Matplotlib
-
[解決済み] re.sub置換パターンにおけるキャプチャグループの後方参照への対応
-
[解決済み] Pythonで文字列が数字で始まるかどうかを判断するには?
-
[解決済み] pathlib.Pathオブジェクトの絶対パスを取得するには?
-
[解決済み] python: 2階層上のディレクトリを取得する
-
[解決済み] Seleniumから要素の属性を取得するには?
-
[解決済み] 2つのデータフレームをマージしようとすると、ValueErrorが発生します。
-
[解決済み] Pythonスクリプトをコンパイルする(実行しない) [重複]。
-
[解決済み] SQLAlchemy が db に送る SQL コマンドのデバッグ(表示)
-
[解決済み] PythonによるCURLの代替