在Flask-SQLAlchemy中查询表的简写

时间:2017-07-27 07:18:24

标签: orm sqlalchemy flask-sqlalchemy

假设我有一个名为import os for path, subdirs, files in os.walk('.'): for name in files: with open(name) as f: #Process the file line by line for line in f: if 'parq' in line: #If pattern is found in file print the path and file print 'Pattern found in directory %s' %path, print 'in file %s' %name break 的模型,以及一个名为User的表格:

followers

有两种方法可以查询followers = db.Table( 'followers', db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) ) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), index=True, unique=True) followed = db.relationship( 'User', secondary=followers, primaryjoin=(followers.c.follower_id==id), secondaryjoin=(followers.c.followed_id==id), backref=db.backref('followers', lazy='dynamic'), lazy='dynamic' ) 模型:

  1. User
  2. db.session.query(User).filter(...).all()
  3. 后者被认为是前者的简写,因为它们功能相同但更紧凑。但是,当我们来到桌面时,User.query.filter(...).all()给了我一个错误:

      

    AttributeError:'Table'对象没有属性'query'

    followers.query.filter(...).all()有简写吗?或者,如何从db.session.query(followers).filter(...).all()对象获取query对象?

5 个答案:

答案 0 :(得分:2)

flask-sqlalchemy仅在query上定义db.Model,所以虽然您可以对Foo.query子类进行db.Model,但您不能在Table上执行相同操作实例。

我想,你可以把它做成monkeypatch,但我不建议这样做。

答案 1 :(得分:1)

您的追随者对象可能存在问题,您可能希望再次检查它。

Follower.query.all()应该可以正常工作

如果您的用户碰巧与关注者有关系,例如。

class User():
    followers = db.relationship("Followers", lazy='dynamic')

您可以通过以下方式执行:

user = User.query.get(id=1)
user.followers.all()

*更新

您的关注者表的声明与您声明User表的方式不同。用户表基于db.Model,db.Model附加了一个查询类: http://flask-sqlalchemy.pocoo.org/2.1/api/#flask.ext.sqlalchemy.Model

此外,您还可以查看页面底部的启蒙之路。

http://flask-sqlalchemy.pocoo.org/2.1/quickstart/#quickstart

答案 2 :(得分:1)

添加到@univerio回答:相反,猴子修补可以将flask_sqlalchemy.Table包装到自定义类中,其中包含query属性作为简写。

class QueryableTable:

    def __init__(self, *args, **kwargs):
        table = db.Table(*args, **kwargs)
        super().__setattr__('_flask_sa_table', table)

    @property
    def query(self):
        return db.session.query(self._flask_sa_table)

    def __getattr__(self, name):
        return getattr(self.__dict__['_flask_sa_table'], name)

    def __setattr__(self, name, value):
        return setattr(self._flask_sa_table, name, value)

将其用作followers = QueryableTable('followers', db.Column(...), ...)

答案 3 :(得分:0)

要使用session.query()方法从表中检索行,您必须将表名放在query()内。

例如:对于表名"同伴",请session.query(fellowers).filter_by(id = fellow_id).one()

答案 4 :(得分:0)

我不确定我使用的解决方案有多常规,但是我采用了pandas.read_sql_querylink),所以它或多或少都可以这样工作:

pandas.read_sql_query('SELECT your_table_column from followers WHERE follower_id = your_id', your_app.config['SQLALCHEMY_DATABASE_URI'])

这为我提供了与所需的follower_id相关的所有记录,作为熊猫数据框,可以进一步处理。