मैं अपने डेटाबेस से तालिकाओं के समूह को दर्शाने के लिए sqlacodegen का उपयोग कर रहा हूं। और मुझे निम्न त्रुटि मिल रही है:

sqlalchemy.exc.AmbiguousForeignKeysError: 'कर्मचारी' और 'बिक्री' के बीच जुड़ने का निर्धारण नहीं कर सकता; तालिकाओं में उनके बीच एक से अधिक विदेशी कुंजी बाधा संबंध होते हैं। कृपया इस जॉइन का 'ऑनक्लॉज' स्पष्ट रूप से निर्दिष्ट करें।

यहाँ मेरी तालिकाओं का एक सरलीकृत संस्करण है। मैंने प्रलेखन में पढ़ा है कि मुझे विदेशी प्रमुख लक्ष्यों के बीच अस्पष्टता को हल करने के लिए foreign_keys पैरामीटर का उपयोग करना चाहिए। हालाँकि, मुझे लगता है कि यह समस्या विरासत के कारण है। क्या कोई मुझे यह समझने में मदद कर सकता है कि क्या हो रहा है।

# coding: utf-8
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()


class Employee(Base):
    __tablename__ = 'Employee'

    EmployeeId = Column(Integer, primary_key=True)


class Sales(Employee):
    __tablename__ = 'Sales'

    EmployeeID = Column(ForeignKey('Employee.EmployeeId'), primary_key=True)
    OldemployeeID = Column(ForeignKey('Employee.EmployeeId'))
    employee = relationship('Employee', foreign_keys=[EmployeeID])
    old_employee = relationship("Employee", foreign_keys=[OldemployeeID])
3
MetalloyD 18 अक्टूबर 2016, 17:12
1
प्रकार निर्दिष्ट करना सुनिश्चित करें (न केवल कॉलम (विदेशी ..., बल्कि कॉलम (पूर्णांक, विदेशी ...)। मैंने इसे इसके बिना कभी नहीं देखा है, सुनिश्चित नहीं है कि यह यहां मुद्दा है। मैंने कभी नहीं किया है तालिका विरासत किया।
 – 
ApolloFortyNine
18 अक्टूबर 2016, 20:41
आप किस प्रकार की विरासत करना चाहते हैं? ऐसा प्रतीत होता है कि आपने अपनी कक्षाओं को विरासत के लिए कॉन्फ़िगर नहीं किया है।
 – 
univerio
18 अक्टूबर 2016, 21:38
मैंने वास्तव में विरासत को स्वयं नहीं किया था। जब मैं अपने डेटाबेस पर sqlacodegen चलाता हूं तो मेरी कुछ तालिकाएं इस प्रकार दिखाई देती हैं।
 – 
MetalloyD
18 अक्टूबर 2016, 22:07
1
खैर, कोड जनरेशन टूल सही नहीं हैं। यदि आप विरासत नहीं चाहते हैं तो विरासत का उपयोग न करें।
 – 
univerio
18 अक्टूबर 2016, 23:36

2 जवाब

जब आपकी तालिकाओं में उनके बीच इनहेरिट करने के लिए कई संभावित पथ हों (Sales.EmployeeID या Sales.OldEmployeeID), SqlAlchemy नहीं जानता कि किसका उपयोग करना है और आपको इसकी आवश्यकता होगी inherit_condition का उपयोग करके इसे स्पष्ट रूप से पथ बताएं। उदाहरण के लिए कर्मचारी आईडी द्वारा इनहेरिट करने के लिए:

class Sales(Employee):
    ...
    __mapper_args__ = { "inherit_condition": EmployeeID == Employee.EmployeeId }

उदाहरण के लिए, आप OldEmployeeID द्वारा, OldEmployeeID == Employee.EmployeeId दर्ज करके भी इनहेरिट कर सकते हैं - इसका मतलब यह होगा कि आपकी Sales प्राथमिक कुंजी और Employee प्राथमिक कुंजी दोनों की अनुमति है अलग बनो।

1
c z 22 नवम्बर 2018, 19:52

बस बैकरेफ का उपयोग करें और कर्मचारी आईडी और पुराने कर्मचारी आईडी दोनों पर इंटीजर का उपयोग करें। अन्यथा आपको एक और त्रुटि मिलेगी।

class Sales(Employee):
    __tablename__ = 'Sales'

    EmployeeID = Column(Integer, ForeignKey('Employee.EmployeeId'), primary_key=True)
    OldemployeeID = Column(Integer, ForeignKey('Employee.EmployeeId'))
    employee = relationship('Employee', foreign_keys=[EmployeeID], backref='Employee')
    old_employee = relationship("Employee", foreign_keys=[OldemployeeID], backref='Employee')
0
SumanKalyan 19 अक्टूबर 2016, 13:34
मुझे अब भी वही मिल रहा है AmbiguousForeignKeysError। यह तब होता है जब मैं वही फाइल चलाता हूं जहां मैंने इन दो वर्गों को परिभाषित किया है।
 – 
MetalloyD
19 अक्टूबर 2016, 13:49