Saya memiliki kelas ORM yang disebut Person, yang mengelilingi tabel person:
Setelah mengatur koneksi ke db dll, saya menjalankan pernyataan:
people = session.query(Person).all()
Tabel person tidak berisi data apa pun (hingga saat ini), jadi ketika saya mencetak variabel people
, saya mendapatkan daftar kosong.
Saya mengganti nama tabel yang dirujuk di kelas ORM saya People
, menjadi people_foo
(yang tidak ada).
Saya kemudian menjalankan skrip lagi. Saya terkejut bahwa tidak ada pengecualian yang dilemparkan saat mencoba mengakses tabel yang tidak ada.
Karena itu, saya memiliki 2 pertanyaan berikut:
- Bagaimana cara saya mengatur SQLAlchemy sehingga kesalahan db kembali ke skrip?
- Bagaimana saya dapat melihat (yaitu mencetak) SQL yang sedang dikirim ke mesin db?
Jika membantu, saya menggunakan PostgreSQL.
[Sunting]
Saya sedang menulis paket. Dalam __main__.py
skrip saya , saya memiliki kode berikut (disingkat di sini):
### __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)
[Sunting2]
Modul umum mengatur logger dengan benar, dan saya dapat menggunakan logger di modul saya yang lain yang mengimpor umum.
Namun dalam dbfuncs
modul, saya mendapatkan kesalahan / peringatan berikut:
Tidak ada penangan yang dapat ditemukan untuk logger "sqlalchemy.engine.base.Engine
sumber
common.setup_logger()
panggilan (dengan asumsi itu mengkonfigurasi logging dengan benar) di sini. Selain itu, Anda tidak perluecho=True
menggunakan logging.Jawaban:
Selain
echo
parametercreate_engine()
ada cara yang lebih fleksibel: mengkonfigurasilogging
pernyataan mesin gema:import logging logging.basicConfig() logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
Lihat bagian Konfigurasi Logging pada dokumentasi untuk informasi lebih lanjut.
sumber
Anda dapat melihat pernyataan SQL yang dikirim ke DB dengan meneruskan
echo=True
saat mesin instance dibuat (biasanya menggunakancreate_engine()
atauengine_from_config()
panggilan dalam kode Anda).Sebagai contoh:
engine = sqlalchemy.create_engine('postgres://foo/bar', echo=True)
Secara default, pernyataan yang dicatat masuk ke stdout.
sumber