Chr*_*nel 6 python sqlalchemy flask
我有3个型号:
class Customer(Model):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
statemented_branch_id = Column(Integer, ForeignKey('branch'))
...
class Branch(Model):
__tablename__ = 'branch'
id = Column(Integer, primary_key=True)
...
class SalesManager(Model):
__tablename__ = 'sales_manager'
id = Column(Integer, primary_key=True)
branches = relationship('Branch', secondary=sales_manager_branches)
Run Code Online (Sandbox Code Playgroud)
和一个表构造:
sales_manager_branches = db.Table(
'sales_manager_branches',
Column('branch_id', Integer, ForeignKey('branch.id')),
Column('sales_manager_id', Integer, ForeignKey('sales_manager.id'))
)
Run Code Online (Sandbox Code Playgroud)
我希望能够得到所有Customers的SalesManager,这意味着所有有客户statemented_branch_id在任何的BranchES的SalesManager.branches关系.
我的查询看起来有点像这样:
branch_alias = aliased(Branch)
custs = Customer.query.join(branch_alias, SalesManager.branches).\
filter(Customer.statemented_branch_id == branch_alias.id)
Run Code Online (Sandbox Code Playgroud)
这显然是不对的.
我怎么能得到Customers一个SalesManager?
更新
当我尝试:
Customer.query.\
join(Branch).\
join(SalesManager.branches).\
filter(SalesManager.id == 1).all()
Run Code Online (Sandbox Code Playgroud)
我得到一个OperationalError:
*** OperationalError: (OperationalError) ambiguous column name: branch.id u'SELECT
customer.id AS customer_id, customer.statemented_branch_id AS
customer_statemented_branch_id \nFROM customer JOIN branch ON branch.id
customer.statemented_branch_id, "SalesManager" JOIN sales_manager_branches AS
sales_manager_branches_1 ON "SalesManager".id = sales_manager_branches_1.sdm_id JOIN
branch ON branch.id = sales_manager_branches_1.branch_id \nWHERE "SalesManager".id = ?'
(1,)
Run Code Online (Sandbox Code Playgroud)
我需要在backref我的SalesManager模型中添加一个允许SQLAlchemy弄清楚如何从SalesManager分支到达的模型.
class SalesManager(Model):
__tablename__ = 'sales_manager'
id = Column(Integer, primary_key=True)
branches = relationship(
'Branch', secondary=sales_manager_branches, backref="salesmanagers")
Run Code Online (Sandbox Code Playgroud)
并构造这样的查询:
Customer.query.\
join(Branch).\
join(Branch.salesmanagers).\
filter(SalesManager.id == 1).all()
Run Code Online (Sandbox Code Playgroud)
尝试:
SalesManager.query \
.join(Branch) \
.join(Customer) \
.filter(SalesManager.id == 123)
Run Code Online (Sandbox Code Playgroud)
您可能需要on通过第二个参数提供显式参数,join或者您可能需要显式添加映射表 - 但在任何一种情况下,您想要执行的操作如下:
SELECT SM.*
FROM sales_manager SM
JOIN sales_manager_branches SMB
ON SM.id = SMB.sales_manager_id
JOIN branch B
ON SMB.branch_id = B.id
JOIN customer C
ON B.id = C.statemented_branch_id
WHERE -- Conditions go here
Run Code Online (Sandbox Code Playgroud)