我使用连接到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.id
和Group.group_start_id
作为公共字段将两个表与自然连接组合在一起。
我能够在单个表中查询所有记录。但我希望通过外键ID连接表格,以便将Group.group_start_id
和Group.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)
如果有任何帮助,我将不胜感激。
答案 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