SQLAlchemy tarafından veritabanına gönderilen SQL komutu hata ayıklama (görüntüleme)


90

Kişi masasının etrafını saran Person adlı bir ORM sınıfım var:

Db vb. İle bağlantı kurduktan sonra şu ifadeyi çalıştırıyorum:

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

Kişi tablosu herhangi bir veri içermiyor (henüz), bu yüzden değişkeni yazdırdığımda peopleboş bir liste alıyorum.

Ben masa benim ORM sınıfında sevk değiştirildi Peopleüzere, people_foo(yok olan).

Daha sonra betiği tekrar çalıştırıyorum. Var olmayan bir tabloya erişmeye çalışırken hiçbir istisna atılmamasına şaşırdım.

Bu nedenle şu 2 sorum var:

  1. SQLAlchemy'yi db hatalarını betiğe geri yayacak şekilde nasıl kurabilirim?
  2. Db motoruna gönderilen SQL'i nasıl görüntüleyebilirim (yani yazdırabilirim)?

Yardımcı oluyorsa, PostgreSQL kullanıyorum.

[Düzenle]

Bir paket yazıyorum. Benim içinde __main__.pykomut dosyası, aşağıdaki kodu (burada kısaltılmış) vardır:

### __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)

[Edit2]

Ortak modül, kaydediciyi doğru şekilde ayarlar ve günlükçüyü, ortak içe aktaran diğer modüllerimde kullanabilirim.

Ancak dbfuncsmodülde aşağıdaki hatayı / uyarıyı alıyorum:

Logger "sqlalchemy.engine.base.Engine için hiçbir işleyici bulunamadı


Kod girintisi bozuk, burada common.setup_logger()arama görmüyorum (günlük kaydını düzgün şekilde yapılandırdığını varsayarsak). Ayrıca, echo=Truegünlük kaydı kullanırken ihtiyacınız yoktur .
Denis Otkidach 01

@denis: Evet, kaydedici ortak modülde doğru şekilde ayarlandı - diğer modüllerde oturum açabiliyorum. Dbfuncs.py modülü için. Hiçbir yükleyiciler logger "sqlalchemy.engine.base.Engine için bulunamadı: Ben hata alıyorum
morpheous

1
Aracı kök kaydedicisi "Hayır işleyicileri logger için bulunamadı" yani logger, hiçbir işleyicileri vardır değil henüz düzgün yapılandırılmış. Muhtemelen yalnızca belirli bir (kök değil) kaydedici yapılandırdınız (ve böylece onu kullanabilirsiniz) veya ilk kullanımdan sonra yapılandırdınız .
Denis Otkidach

Yanıtlar:


213

echoParametresine ek olarak create_engine()daha esnek bir yol var: loggingmotor ifadelerini yankılamak için yapılandırma :

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

Daha fazla bilgi için belgelerin Günlük Kaydını Yapılandırma bölümüne bakın .


1
@dennis: Bunu yapmayı tercih ederim - opf konsolu yerine dosyaya giriş yapmak. Zaten paketimin ana .py dosyasında oturum açmayı kullanıyorum (düzenlenmiş koduma bakın) - önerdiğiniz değişiklikleri yaptıktan sonra, artık mesajlar konsolda görünmüyor (iyi), ancak günlük dosyasında da görünmüyor (kötü). Dosyaya kaydedilen mesajların nasıl alınacağını açıklayabilir misiniz?
morpheous

3
Güzel baskı eklemenin bir yolu var mı? Sorgularımın varsayılan olarak çıktısı küçük bir felakettir.
rr-

Öyleyse sonunda bir dosyaya giriş yapmak imkansız mı? Dokümanları ve yığın taşmasını derinlemesine araştırdım, ancak soru yukarıda morpheous gibi biri tarafından açıkça sorulsa bile, kimse bu sorunu umursamıyor gibi görünüyor. Burada bariz bir şey var mı?
Romain Vincent

1
@RomainVincent Günlüğe kaydetmeyi yapılandırarak, dosya dahil olmak üzere günlüğe kaydedilen bilgileri istediğiniz yere yönlendirmek mümkündür.
Denis Otkidach

82

echo=TrueMotor örneği oluşturulduğunda (genellikle kodunuzda create_engine()veya engine_from_config()çağrısını kullanarak) geçerek DB'ye gönderilen SQL ifadelerini görebilirsiniz .

Örneğin:

engine = sqlalchemy.create_engine('postgres://foo/bar', echo=True)

Varsayılan olarak, günlüğe kaydedilen ifadeler stdout'a gider.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.