2013-07-23 3 views
6

मैं 3 मॉडल है:कुप्पी के SQLAlchemy 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) 

और एक मेज निर्माण:

sales_manager_branches = db.Table(
    'sales_manager_branches', 
    Column('branch_id', Integer, ForeignKey('branch.id')), 
    Column('sales_manager_id', Integer, ForeignKey('sales_manager.id')) 
) 

मैं एक SalesManager के लिए सभी Customers प्राप्त करने में सक्षम होना चाहता हूँ , जिसका अर्थ है BranchSalesManager.branches संबंधों में से किसी एक में statemented_branch_id वाले सभी ग्राहक हैं।

branch_alias = aliased(Branch) 
custs = Customer.query.join(branch_alias, SalesManager.branches).\ 
     filter(Customer.statemented_branch_id == branch_alias.id) 

स्पष्ट रूप से सही नहीं है कौन सा:

मेरे क्वेरी कुछ थोड़ा इस तरह लग रही है।

SalesManager के लिए मैं सभी Customers कैसे प्राप्त कर सकता हूं?

अद्यतन

जब मैं कोशिश:

*** 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,) 
+3

आप इस मामले में शामिल होने के लिए '' aliased' Branch' करना होगा, जैसा SQLAlchemy SQL में 'branch' तालिका रहा है दो बार , और दोनों बार उपनाम के बिना। –

+0

धन्यवाद शॉन, मैं इसे नीचे दिए गए मेरे उत्तर में ऐसा कर रहा हूं। मैंने आपके उत्तर/टिप्पणियों को अप-वोट दिया है, लेकिन जब मैं कर सकता हूं तो मैं अपना खुद का स्वीकार करूंगा। –

उत्तर

7

मैं करने के लिए आवश्यक मेरे SalesManager मॉडल में backref जोड़ें जो SQLAlchemy को यह पता लगाने की अनुमति देता है कि SalesManager से शाखा में कैसे प्राप्त करें।

class SalesManager(Model): 
    __tablename__ = 'sales_manager' 

    id = Column(Integer, primary_key=True) 
    branches = relationship(
     'Branch', secondary=sales_manager_branches, backref="salesmanagers") 

और इस तरह क्वेरी बना:

Customer.query.\ 
     join(Branch).\ 
     join(Branch.salesmanagers).\ 
     filter(SalesManager.id == 1).all() 
1

प्रयास करें:

SalesManager.query \ 
      .join(Branch) \ 
      .join(Customer) \ 
      .filter(SalesManager.id == 123) 

आप ne सकता है

Customer.query.\ 
     join(Branch).\ 
     join(SalesManager.branches).\ 
     filter(SalesManager.id == 1).all() 

मैं एक OperationalError मिल एड join को स्पष्ट on पैरामीटर प्रदान करने के लिए, दूसरा तर्क के माध्यम से, या आप स्पष्ट रूप में मानचित्रण तालिका जोड़ना पड़ सकता है - लेकिन दोनों ही मामलों तुम क्या करने कोशिश कर रहे हैं में निम्नलिखित है:

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 
+0

यह 'सेल्समैनेजर' की एक सूची वापस करेगा, है ना? मुझे 'ग्राहक की सूची चाहिए। –

+0

आपके उत्तर के लिए धन्यवाद, मैंने कोशिश की है कि मैं क्या कर रहा हूं इसके साथ ऊपर अपना प्रश्न अपडेट कर दिया है। –

संबंधित मुद्दे