【问题标题】:sql alchemy : derived column examplesqlalchemy:派生列示例
【发布时间】:2013-01-24 04:23:23
【问题描述】:
#necessary import goes here
engine = sqlalchemy.create_engine('mysql://root@127.0.0.1/test',echo=False)
print 'Engine created'
connection=engine.connect()
metadata=MetaData(engine)
metadata.bind=engine
Session =  sessionmaker(bind=engine)
session = Session()
mapping = Table('mapping',metadata,autoload=True)

class Mapping(object):
    pass
MappingMapper=mapper(Mapping,mapping)

现在我可以为插入、更新、删除、过滤等编写基本查询了。

问:1 我需要编写复杂的查询,我确实根据现有列派生新列。前任。 ColA,ColB 在表上,ColC 不是表结构的一部分。 从 ColC > 50 order by ColC 的表中选择 (ColA+ColB) 作为 ColC。

我不知道如何用 SqlAlchemy 转换上面的查询。如何映射,如何检索。

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    最简单的是使用Hybrid Attributes。 在您的情况下,只需将类的声明更改为以下内容:

    from sqlalchemy.ext.hybrid import hybrid_property
    
    class Mapping(object):
        @hybrid_property
        def ColC(self):
            return self.ColA + self.ColB
    

    然后查询:

    qry = session.query(Mapping).filter(Mapping.ColC > 80) 
    

    会生成SQL:

    SELECT mapping.id AS mapping_id, ...
    FROM mapping
    WHERE mapping."ColA" + mapping."ColB" > ?
    

    【讨论】:

    • 谢谢,如果我不想在 python 代码中硬编码表的列详细信息但想使用 Metadata('mapping',metatdata,autoload=True) 我不知道该怎么做,我的表有 40 列,我不想在 python 中全部写下来。
    • 谢谢!这很容易,但我无法弄清楚如何,现在它完成了。谢谢@van
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多