我在sql-alchemy中使用delcarative base来查询数据。

from sqlalchemy.ext.declarative import declarative_base
OdsBase = declarative_base(metadata=sql.MetaData(schema='ods'))
class BagImport(OdsBase):
    __tablename__ = 'bag_stg_import' 
    __table_args__ = {'extend_existing': True} 
    PAN = sql.Column(sql.String(50), primary_key = True)
    GEM = sql.Column(sql.String(50))
    def __repr__(self):
        return "<{0} Pan: {1} - Gem: {2}>".format(self.__class__.__name__, self.PAN, self.GEM)

如果我这样做,我就会得到一个合适的结果。

my_session.query(BagImport).first()        

但是,如果我想看查询,而且我想看。

the_query = my_session.query(BagImport)
print(the_query)

我得到的输出查询是:。

SELECT ods.bag_stg_import."PAN" AS "ods_bag_stg_import_PAN_1", ods.bag_stg_import."GEM" AS "ods_bag_stg_import_GEM_2"
FROM ods.bag_stg_import

为什么SQL-Alchemy在别名中要以表名为前缀,例如:SELECT ods.bag_stg_import."PAN" AS "ods_bag_stg_import_PAN_1"?

我怎样才能使它成为AS SELECT ods.bag_stg_import."PAN" AS "PAN"?

3 个评论
它这样做是为了确保查询中列名的唯一性。 从下面的警告可以看出查询.with_labels这种行为不能被禁用,但我可能是错的。
不过,如果你只是想打印没有标签的查询,the_query.statement也许可以。
Kay:
print(the_query.statement), works!
python
sqlalchemy
Kay
Kay
发布于 2020-02-20
2 个回答
B T
B T
发布于 2020-02-20
已采纳
0 人赞同

我在使用except_这样的查询方法时发生了这种情况。

included_query.except_(excluded_query)

我通过改成这种模式来解决这个问题

excluded_subquery = excluded_query.with_entities(ModelClass.id).subquery()
included_query.filter(ModelClass.id.notin_(excluded_subquery))
    
RIYAJ MULLA
RIYAJ MULLA
发布于 2020-02-20
0 人赞同

只要在你的模型中提到以下元属性