Gỡ lỗi (hiển thị) lệnh SQL được SQLAlchemy gửi đến db


87

Tôi có một lớp ORM được gọi là Person, lớp này bao quanh một bảng người:

Sau khi thiết lập kết nối với db, v.v., tôi chạy câu lệnh:

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

Bảng người không chứa bất kỳ dữ liệu nào (như chưa có), vì vậy khi tôi in biến people, tôi nhận được một danh sách trống.

Tôi đã đổi tên bảng được tham chiếu trong lớp ORM của mình Peoplethành people_foo(không tồn tại).

Sau đó tôi chạy lại script. Tôi rất ngạc nhiên rằng không có ngoại lệ nào được ném ra khi cố gắng truy cập vào một bảng không tồn tại.

Do đó, tôi có 2 câu hỏi sau:

  1. Làm cách nào để thiết lập SQLAlchemy để nó truyền lỗi db trở lại tập lệnh?
  2. Làm cách nào tôi có thể xem (tức là in) SQL đang được gửi đến công cụ db?

Nếu nó hữu ích, tôi đang sử dụng PostgreSQL.

[Biên tập]

Tôi đang viết một gói. Trong __main__.pytập lệnh của tôi , tôi có mã sau (được rút gọn ở đây):

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

[Chỉnh sửa2]

Mô-đun chung thiết lập trình ghi một cách chính xác và tôi có thể sử dụng trình ghi trong các mô-đun nhập chung khác của tôi.

Tuy nhiên, trong dbfuncsmô-đun, tôi nhận được lỗi / cảnh báo sau:

Không tìm thấy trình xử lý nào cho trình ghi nhật ký "sqlalchemy.engine.base.Engine


Chú ý đến mã bị hỏng, tôi không thấy common.setup_logger()cuộc gọi nào (giả sử nó định cấu hình ghi nhật ký đúng cách) ở đây. Ngoài ra, bạn không cần echo=Truekhi sử dụng ghi nhật ký.
Denis Otkidach

@denis: Có, trình ghi nhật ký được thiết lập chính xác trong mô-đun chung - Tôi có thể đăng nhập vào các mô-đun khác. Đối với mô-đun dbfuncs.py. Tôi nhận được lỗi: Không xử lý có thể được tìm thấy cho logger "sqlalchemy.engine.base.Engine
morpheous

1
"Không tìm thấy trình xử lý nào cho trình ghi nhật ký" có nghĩa là trình ghi gốc không có trình xử lý, tức là trình ghi nhật ký chưa được định cấu hình đúng cách. Có thể là bạn đã chỉ định cấu hình một số trình ghi nhật ký cụ thể (không phải root) (và vì vậy bạn có thể sử dụng nó) hoặc bạn đã cấu hình nó sau khi nó được sử dụng lần đầu tiên.
Denis Otkidach

Câu trả lời:


209

Ngoài echotham số của create_engine()có một cách linh hoạt hơn: cấu hình loggingcho các câu lệnh của echo engine:

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

Xem phần Định cấu hình ghi nhật ký của tài liệu để biết thêm thông tin.


1
@dennis: đây là điều tôi muốn làm - đăng nhập vào tệp thay vì bảng điều khiển opf. Tôi đã sử dụng đăng nhập .py chính trong gói của tôi (xem mã đã chỉnh sửa của tôi) - sau khi thực hiện các thay đổi mà bạn đề xuất, bây giờ các thông báo không còn xuất hiện trên bảng điều khiển (tốt), nhưng chúng cũng không xuất hiện trong tệp nhật ký (xấu). Bạn có thể làm rõ cách tải các tin nhắn vào tệp không?
morpheous

3
Có cách nào để thêm in ấn đẹp không? Cách các truy vấn của tôi được xuất theo mặc định là một thảm họa nhỏ.
rr-

Vậy rốt cuộc cái này không thể đăng nhập vào một tập tin sao? Tôi đã tìm kiếm sâu trong tài liệu và tràn ngăn xếp, nhưng dường như không ai quan tâm đến vấn đề này, ngay cả khi câu hỏi được hỏi rõ ràng bởi một người như morpheous đã nói ở trên. Có điều gì đó rõ ràng ở đây?
Romain Vincent

1
@RomainVincent Có thể chuyển hướng thông tin đã ghi vào bất cứ đâu bạn muốn, kể cả tệp, bằng cách định cấu hình ghi nhật ký.
Denis Otkidach

78

Bạn có thể thấy các câu lệnh SQL được gửi đến DB bằng cách chuyển echo=Truekhi phiên bản động cơ được tạo (thường sử dụng lệnh gọi create_engine()hoặc engine_from_config()trong mã của bạn).

Ví dụ:

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

Theo mặc định, các câu lệnh đã ghi được chuyển đến stdout.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.