2011-12-21 20 views
6

का उपयोग करके MySQL से अंतिम डाला गया मान प्राप्त करें, मैंने अभी काफी परेशानी की समस्या में भाग लिया है, और परीक्षण के बाद मुझे पता चला है कि उपलब्ध उत्तरों में से कोई भी पर्याप्त नहीं है।SQLAlchemy

मैंने कई सुझाव देखे हैं लेकिन कोई भी MySQL में auto_increment फ़ील्ड के लिए अंतिम सम्मिलित मान वापस करने में सक्षम नहीं प्रतीत होता है।

मैंने ऐसे उदाहरण देखे हैं जो रिकॉर्ड जोड़ने के लिए session.flush() के उपयोग का उल्लेख करते हैं और फिर आईडी पुनर्प्राप्त करते हैं। हालांकि हमेशा वापस जाने के लिए 0.

मैं भी कि session.refresh (के प्रयोग का उल्लेख उदाहरण देखा है लगता है कि), लेकिन यह है कि निम्न त्रुटि को जन्म देती है: InvalidRequestError: उदाहरण के ''

मैं क्या कर रहा हूँ से ताज़ा नहीं किया जा सका ऐसा करने की कोशिश करना बेहद सरल लगता है लेकिन मुझे रहस्य पता लगाना प्रतीत नहीं होता है।

मैं घोषणात्मक दृष्टिकोण का उपयोग कर रहा हूं।

तो, मेरे कोड इस तरह दिखता है:

class Foo(Base): 
    __tablename__ = 'tblfoo' 
    __table_args__ = {'mysql_engine':'InnoDB'} 

    ModelID = Column(INTEGER(unsigned=True), default=0, primary_key=True, autoincrement=True) 
    ModelName = Column(Unicode(255), nullable=True, index=True) 
    ModelMemo = Column(Unicode(255), nullable=True) 

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

इस बिंदु पर, वस्तु च डीबी को धक्का दे दिया गया है, और स्वचालित रूप से एक अनूठा प्राथमिक कुंजी आईडी सौंपा गया है। हालांकि, मुझे कुछ अतिरिक्त परिचालनों में उपयोग करने के लिए मूल्य प्राप्त करने का कोई तरीका नहीं मिल रहा है। मैं निम्नलिखित करना चाहते हैं:

my_new_id = f.ModelID

मैं जानता हूँ कि मैं सिर्फ देखने के लिए ModelID अन्य मापदंडों के आधार पर किसी अन्य क्वेरी को निष्पादित कर सकता है, लेकिन मैं नहीं सभी के लिए यदि संभव पसंद करेंगे।

मैं इस समस्या के समाधान में किसी भी अंतर्दृष्टि की सराहना करता हूं।

अग्रिम सहायता के लिए धन्यवाद।

उत्तर

9

समस्या यह है कि आप ऑटो वृद्धि के लिए defaul सेट कर रहे हैं। इसलिए, जब क्वेरी में डालने चलाने सर्वर लॉग

2011-12-21 13:44:26,561 INFO sqlalchemy.engine.base.Engine.0x...1150 INSERT INTO tblfoo (`ModelID`, `ModelName`, `ModelMemo`) VALUES (%s, %s, %s) 
2011-12-21 13:44:26,561 INFO sqlalchemy.engine.base.Engine.0x...1150 (0, 'Bar', 'Foo') 
ID : 0 

तो उत्पादन 0 है जो डिफ़ॉल्ट मान है और पारित हो जाता है जो क्योंकि आप autoincrement स्तंभ के लिए डिफ़ॉल्ट मान सेट कर रहे हैं है।

यदि मैं default के बिना एक ही कोड चलाता हूं तो यह सही आउटपुट देता है।

इस कोड

from sqlalchemy import create_engine 
engine = create_engine('mysql://test:[email protected]/test1', echo=True) 

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

from sqlalchemy.orm import sessionmaker 
Session = sessionmaker(bind=engine) 

session = Session() 

from sqlalchemy import Column, Integer, Unicode 

class Foo(Base): 
    __tablename__ = 'tblfoo' 
    __table_args__ = {'mysql_engine':'InnoDB'} 

    ModelID = Column(Integer, primary_key=True, autoincrement=True) 
    ModelName = Column(Unicode(255), nullable=True, index=True) 
    ModelMemo = Column(Unicode(255), nullable=True) 

Base.metadata.create_all(engine) 

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

print "ID :", f.ModelID 
+1

अच्छा पकड़, डिफ़ॉल्ट = 0 नोटिस नहीं किया। –

+1

सर्वर लॉग हमेशा समस्या को खोजने के लिए काम करेगा :) – Nilesh

+1

उह ... हाँ, अच्छा पकड़ो। मेरा सिर SQL दुनिया में था जहां आप तालिका बनाते समय प्राथमिक कुंजी फ़ील्ड के लिए डिफ़ॉल्ट मान आवश्यक है। खोजने के लिए धन्यवाद। – PlaidFan

1

session.flush() के बजाय session.commit() का उपयोग करने का प्रयास करें। फिर आप f.ModelID का उपयोग कर सकते हैं।

+0

मैं दोनों फ्लश के बाद यह कोशिश की और प्रतिबद्ध लेकिन निम्न त्रुटि प्राप्त: AttributeError: 'फू' ऑब्जेक्ट कोई विशेषता 'आईडी' – PlaidFan

+0

क्षमा करें, अद्यतन है आपके द्वारा स्कीमा घोषणा में उपयोग किए गए मॉडल आईडी का उपयोग करने का उत्तर। फिर भी, आपको शायद 'ModelID' के बजाय 'id' का उपयोग करना चाहिए। –

+0

अफसोस की बात है, मैंने कोशिश की है कि कई तरीकों से संपर्क करें और निम्न त्रुटि प्राप्त करना जारी रखें: ऑब्जेक्ट हटाया गया त्रुटि: इंस्टेंस '<0x397d190> पर Foo हटा दिया गया है। – PlaidFan

1

सुनिश्चित नहीं हैं कि क्यों चिह्नित किये जवाब आप के लिए काम किया: प्रयास करें। लेकिन मेरे मामले में, यह वास्तव में तालिका में पंक्ति को सम्मिलित नहीं करता है। मुझे अंत में commit() पर कॉल करने की आवश्यकता है।

तो कोड के अंतिम कुछ पंक्तियां हैं:

f = Foo(ModelName='Bar', ModelMemo='Foo') 
session.add(f) 
session.flush() 

print "ID:", f.ModelID 

session.commit()