[英]SQLAlchemy & pandas: How to query columns with a different 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.