簡體   English   中英

為什么 SQLAlchemy Label 列在查詢

[英]Why Does SQLAlchemy Label Columns in Query

當我在 SQLAlchemy 中進行查詢時,我注意到查詢對每一列都使用了 AS 關鍵字。 它為每一列設置alias_name = column_name

例如,如果我運行命令print(session.query(DefaultLog)) ,它會返回:

注意: DefaultLog是我的表 object。

SELECT default_log.id AS default_log_id, default_log.msg AS default_log_msg, default_log.logger_time AS default_log_logger_time, default_log.logger_line AS default_log_logger_line, default_log.logger_filepath AS default_log_logger_filepath, default_log.level AS default_log_level, default_log.logger_name AS default_log_logger_name, default_log.logger_method AS default_log_logger_method, default_log.hostname AS default_log_hostname
FROM default_log

為什么它使用別名 = 原始名稱? 有什么方法可以禁用此行為嗎?

先感謝您!

當我在SQLAlchemy中進行查詢時,我注意到查詢對每一列都使用AS關鍵字。 它為每列設置alias_name = column_name

例如,如果我運行命令print(session.query(DefaultLog)) ,它將返回:

注意: DefaultLog是我的表對象。

SELECT default_log.id AS default_log_id, default_log.msg AS default_log_msg, default_log.logger_time AS default_log_logger_time, default_log.logger_line AS default_log_logger_line, default_log.logger_filepath AS default_log_logger_filepath, default_log.level AS default_log_level, default_log.logger_name AS default_log_logger_name, default_log.logger_method AS default_log_logger_method, default_log.hostname AS default_log_hostname
FROM default_log

為什么使用別名=原始名稱? 有什么方法可以禁用此行為?

先感謝您!

可以破解 sqlachemy Query 類以不添加標簽。 但是必須注意,當一個表在查詢中使用兩次時,這會中斷。 例如,自聯接或聯接思想另一個表。

from sqlalchemy.orm import Query

class MyQuery(Query):
    def __iter__(self):
        """Patch to disable auto labels"""
        context = self._compile_context(labels=False)
        context.statement.use_labels = False
        if self._autoflush and not self._populate_existing:
            self.session._autoflush()
        return self._execute_and_instances(context)

然后根據mtth答案使用它

sessionmaker(bind=engine, query_cls=MyQuery)

打印 SQLAlchemy 查詢很棘手,並且生成的 output 對人類不友好。 不僅列而且綁定參數都在一個奇怪的地方。 以下是如何正確執行此操作:

qry = session.query(SomeTable)
compiled = qry.statement.compile(dialect=session.bind.dialect, compile_kwargs={"literal_binds": True})
print(compiled)

以下是如何為您未來的所有工作修復它:

from sqlalchemy.orm import Query
class MyQuery(Query):
    def __str__(self):
        dialect = self.session.bind.dialect
        compiled = self.statement.compile(dialect=dialect, compile_kwargs={"literal_binds": True})
        return str(compiled)

要使用:

session = sessionmaker(bind=engine, query_cls=MyQuery)()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM