如何使用SQLAlchemy和Flask在两个表上执行自然连接?

时间:2016-05-31 22:03:28

标签: python database postgresql flask flask-sqlalchemy

我使用连接到PostgresSQL数据库的Flask SQLAlchemy在Python中定义了两个表Entry和Group:

class Entry (db.Model):
    __tablename__ = "entry"
    id = db.Column('id', db.Integer, primary_key = True)
    group_title = db.Column('group_title', db.Unicode, db.ForeignKey('group.group_title'))
    url = db.Column('url', db.Unicode)
    next_entry_id = db.Column('next_entry_id', db.Integer,  db.ForeignKey('entry.id'))

    entry = db.relationship('Entry', foreign_keys=next_entry_id)
    group = db.relationship('Group', foreign_keys=group_title)

class Group (db.Model):
    __tablename__ = "group"
    group_title = db.Column('group_title', db.Unicode, primary_key = True)
    group_start_id = db.Column('group_start_id', db.Integer)
    #etc.

我正在尝试使用Entry.idGroup.group_start_id作为公共字段将两个表与自然连接组合在一起。

我能够在单个表中查询所有记录。但我希望通过外键ID连接表格,以便将Group.group_start_idGroup.group_title与特定Entry记录相关联的记录。

我在使用Flask-SQLAlchemy查询语法或进程时遇到问题

我尝试了几种方法(列举一些):

db.session.query(Group, Entry.id).all()

db.session.query(Entry, Group).all()

db.session.query.join(Group).first()

db.session.query(Entry, Group).join(Group)

所有这些都返回了一个比预期更大的元组列表,但不包含我想要的内容。 我正在寻找以下结果: (Entry.id, group_title, Group.group_start_id, Entry.url)

如果有任何帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

我使用以下查询为Group和Entry Table执行natuaral join: db.session.query(Entry, Group).join(Group).filter(Group.group_start_id == Entry.id).order_by(Group.order.asc())

我使用查询中的.join函数执行此操作,该函数允许我将Group表连接到Entry表。然后我使用Group.group_start_id过滤查询结果,Entry.id是Group表中的外键,它引用了作为Entry表中主键的template<typename T> struct C { auto method1( int a, int b ){ return static_cast<T*>(this)->method1Impl(a, b); } }; struct A: C<A> { int method1Impl( int a, int b ) { return 42; } }; struct B: C<B> { float method1Impl( int a, int b ) { return .0; } }; int main() { A a; B b; a.method1(0, 0); b.method1(0, 0); }

答案 1 :(得分:0)

由于您已使用relationship()调用执行了基本联接。 我们可以专注于获取您想要的数据,db.session.query(Entry, Group).all()等查询会返回(Entry, Group)类型的元组,您可以轻松地执行以下操作:

test = db.session.query(Entry, Group).one()
print(test[0].id)             #prints entry.id
print(test[1].group_start_id) # prints Group.group_start_id
#...

SQLAlchemy有关于联接如何工作的great article