为什么在查询中使用SQLAlchemy标签列

时间:2019-04-18 22:00:48

标签: python sqlalchemy

当我在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

为什么使用别名=原始名称?有什么方法可以禁用此行为?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

Query.statement

  

此查询代表的完整SELECT语句。

     

默认情况下,该语句将不会应用歧义标签   除非首先调用with_labels(True),否则该结构。

使用此模型:

class DefaultLog(Base):

    id = sa.Column(sa.Integer, primary_key=True)
    msg = sa.Column(sa.String(128))
    logger_time = sa.Column(sa.DateTime)
    logger_line = sa.Column(sa.Integer)

print(session.query(DefaultLog).statement)显示:

SELECT defaultlog.id, defaultlog.msg, defaultlog.logger_time, defaultlog.logger_line
FROM defaultlog

print(session.query(DefaultLog).with_labels().statement)显示:

SELECT defaultlog.id AS defaultlog_id, defaultlog.msg AS defaultlog_msg, defaultlog.logger_time AS defaultlog_logger_time, defaultlog.logger_line AS defaultlog_logger_line
FROM defaultlog

您问:

  

为什么使用别名=原始名称?

来自Query.with_labels文档:

  

...这通常用于消除多个具有相同名称的表中的列的歧义。

因此,如果您要发出一个调用多个表的查询,则没有什么可以阻止那些具有相同名称的列的表了。

  

是否可以通过某种方式禁用此行为?

也来自Query.with_labels文档:

  

当查询实际发出SQL来加载行时,它总是使用列   标签。

所有检索行(get()one()one_or_none()all()并遍历Query的方法都通过{{3 }}方法:

def __iter__(self):
    context = self._compile_context()
    context.statement.use_labels = True
    if self._autoflush and not self._populate_existing:
        self.session._autoflush()
    return self._execute_and_instances(context)

...,其中此行硬编码标签用法:context.statement.use_labels = True。因此它是“内置”的,不能禁用。

您可以执行不带标签的语句:

session.execute(session.query(DefaultLog).statement)

...但是这使ORM脱离了方程式。