将SQL转换为SQL炼金术

时间:2014-07-01 10:32:55

标签: python mysql orm sqlalchemy flask-sqlalchemy

我是Flask SQl炼金术的新手;虽然我明白炼金术抽象了sql语法并且在创建模型时简单易行;有时候我们想要以非常具体的方式可视化前端的数据。

我有以下查询,我想使用alchemy使用session.query和过滤器以及可能的分组。

我的查询是:

  1. MySQL的> SELECT status, COUNT(id) FROM bar_baz where not name = 'Foo' and not name = 'Bar' GROUP BY status
  2. select (select COUNT(id) FROM instance where not name = 'erf' and not tiername = 'wer' and type='app') as app, (select COUNT(1) FROM instance_2 where not name = 'visq' and not name = 'werf' and type='adc') as adc from dual;
  3. 我验证了以下查询适用于MySQL;我想知道我们是否有类似于

    的功能
    c = conn.cursor()
    query = 'SELECT status, COUNT(id) FROM bar_baz where not name = 'Foo' and not name = 'Bar' GROUP BY status'
    c.execute(query)
    print c.fetchall()
    
    
    class Instance(Base):
        __tablename__ = 'instance'
    
        id = Column(Integer, primary_key=True)
        name = Column(String)
        status = Column(String)
        type = Column(String)
    
    class Instance2(Base):
        __tablename__ = 'instance_2'
    
        id = Column(Integer, primary_key=True)
        name = Column(String)
        status = Column(String)
        type = Column(String)
        inc = Column(Integer)
    

    感兴趣的查询:

    select (select COUNT(id) FROM instance where not name = 'erf' and not tiername = 'wer' and type='app') as app, (select COUNT(1) FROM instance_2 where not name = 'visq' and not name = 'werf' and type='adc') as adc from dual;`
    

1 个答案:

答案 0 :(得分:3)

对于第一个查询,使用db.func.count生成计数表达式。其他所有内容都应该来自docs

status_counts = db.session.query(BarBaz.status, db.func.count(BarBaz.id).label('count_id')
).filter(db.not_(db.or_(BarBaz.name == 'Foo', BarBaz.name == 'Bar'))
).group_by(BarBaz.status
).all()

对于第二个查询,请使用subquery()生成可选择的查询。

sub_app = db.session.query(db.func.count(Instance.id).label('app')
).filter(db.not_(db.or_(Instance.name == 'erf', Instance.tiername == 'wer')), Instance.type == 'app'
).subquery()

sub_adc = db.session.query(db.func.count(Instance.id).label('adc')
).filter(db.not_(db.or_(Instance2.name == 'visq', Instance2.name == 'werf')), Instance2.type == 'adc'
).subquery()

out = db.session.query(sub_app.c.app, sub_adc.c.adc).all()