2012-05-08 11 views
19

शुरू SQLAlchemy में autoincrement तर्क केवल True और False प्रतीत हो रहा है, लेकिन मैं पूर्व निर्धारित मूल्य aid = 1001, autoincrement aid = 1002 के माध्यम से जब अगले डालने से किया जाता है सेट करना चाहते हैं।स्थापना SQLAlchemy AutoIncrement मूल्य

एसक्यूएल में, की तरह बदला जा सकता है:

ALTER TABLE article AUTO_INCREMENT = 1001; 

मैं MySQL उपयोग कर रहा हूँ और मैं कोशिश की है निम्नलिखित है, लेकिन यह काम नहीं करता है:

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
class Article(Base): 
    __tablename__ = 'article' 
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
       autoincrement=1001, primary_key=True) 

तो, मैं कैसे प्राप्त कर सकते हैं उस? अग्रिम में धन्यवाद!

उत्तर

16

आप DDLEvents का उपयोग कर इसे प्राप्त कर सकते हैं। CREATE TABLE भागने के बाद यह आपको अतिरिक्त SQL कथन चलाने की अनुमति देगा। लिंक में उदाहरण को देखो, लेकिन मैं अपने कोड के नीचे के समान दिखेगा अनुमान लगा रहा हूँ:

from sqlalchemy import event 
from sqlalchemy import DDL 
event.listen(
    Article.__table__, 
    "after_create", 
    DDL("ALTER TABLE %(table)s AUTO_INCREMENT = 1001;") 
) 
+0

ऐसा करने का गंदा तरीका है यह काम करता है! बहुत बहुत धन्यवाद। – Gorthon

+1

क्या डीबी प्रदाता के आधार पर इसे निष्पादित करने से बाहर करने का कोई तरीका है? ALTER ... AUTO_INCREMENT MySQL (और मुझे लगता है कि अन्य डीबीएस) के लिए ठीक काम करता है, हालांकि, यह एसक्यूएल स्पष्ट रूप से SQLITE के लिए असमर्थित है। मुझे मिल सकता है कि निकटतम कामकाज एक डालने/हटाने के लिए है: http://stackoverflow.com/questions/692856/set-start-value-for-autoincrement-in-sqlite – coderfi

+1

ने अपना खुद का प्रश्न उत्तर दिया। कोड के माध्यम से पोकिंग, मुझे समाधान मिला, जिसे दस्तावेज किया गया है: http://docs.sqlalchemy.org/en/rel_0_8/core/ddl.html#sqlalchemy.schema.DDLElement.execute_if उपरोक्त को फिर से लिखा जा सकता है event.listen ( अनुच्छेद .__ table__, "after_create", DDL ("टेबल% (तालिका ALTER) रों AUTO_INCREMENT = 1001;") execute_if (बोली = ('PostgreSQL', 'mysql')) ।) जो मुझे स्क्लाइट समस्या के आसपास ले जाता है। – coderfi

14

the docs के अनुसार:

autoincrement - इस ध्वज गलत पर सेट किया जा सकता है एक पूर्णांक प्राथमिक कुंजी स्तंभ है कि "autoincrement" कॉलम नहीं माना जाना चाहिए इंगित करने के लिए, कि पूर्णांक प्राथमिक कुंजी है कॉलम जो INSERT पर मूल्यों को स्पष्ट रूप से उत्पन्न करता है और जिसका मान आमतौर पर डीबीएपीआई कर्सर .lastrowid विशेषता के माध्यम से वापस किया जाता है। यह एक पूर्णांक प्राथमिक कुंजी कॉलम वाले तालिका के सामान्य उपयोग केस को संतुष्ट करने के लिए सही पर डिफ़ॉल्ट होता है।

तो, autoincrement केवल एक SQLAlchemy पता है कि यह प्राथमिक कुंजी आप को बढ़ाने के लिए चाहते हैं कि क्या यह बताने के लिए झंडा है।

आप जो करने का प्रयास कर रहे हैं वह कस्टम ऑटोइनक्रिएटमेंट अनुक्रम बनाना है।

तो, अपने उदाहरण, मैं लगता , कुछ ऐसा दिखाई देगा:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.schema import Sequence 

Base = declarative_base() 

class Article(Base): 
    __tablename__ = 'article' 
    aid = Column(INTEGER(unsigned=True, zerofill=True), 
       Sequence('article_aid_seq', start=1001, increment=1), 
       primary_key=True) 

नोट करें कि क्या आप PostgreSQL या नहीं का उपयोग कर रहे हैं, मैं नहीं जानता, ताकि आप following का ध्यान करना चाहिए यदि आप हैं:

अनुक्रम वस्तु पोस्टग्रेस्क्ल के सीरियल डेटाटाइप को समायोजित करने के लिए विशेष कार्यक्षमता भी लागू करती है। पीजी में सीरियल प्रकार स्वचालित रूप से एक अनुक्रम उत्पन्न करता है जिसका उपयोग आवेषण के दौरान पूरी तरह से किया जाता है। इसका अर्थ यह है कि यदि कोई टेबल ऑब्जेक्ट अपने प्राथमिक कुंजी कॉलम पर अनुक्रम परिभाषित करता है ताकि यह ओरेकल और फायरबर्ड के साथ काम करता है, तो अनुक्रम "सामान्य" अनुक्रम के रास्ते में होगा जो पीजी सामान्य रूप से उपयोग करेगा। इस उपयोग के मामले में, ध्वज वैकल्पिक = अनुक्रम वस्तु के लिए सही जोड़ें - यह इंगित करता है कि अनुक्रम केवल तभी उपयोग किया जाना चाहिए जब डेटाबेस प्राथमिक कुंजी पहचानकर्ता उत्पन्न करने के लिए कोई अन्य विकल्प प्रदान न करे।

+0

मैं MySQL का उपयोग कर रहा हूं। दस्तावेज़ों के अनुसार: यह केवल उन डेटाबेस पर प्रभाव डालता है जिनके पास अनुक्रमों के लिए स्पष्ट समर्थन है, जो वर्तमान में ** पोस्टग्रेस्क्ल **, ** ओरेकल **, और ** फ़ायरबर्ड ** शामिल हैं। मैंने आपके कोड की कोशिश की, लेकिन यह अभी भी काम नहीं करता है। – Gorthon

+0

अहह, मेरा बुरा (जब भी मैं देख सकता हूं मैं पीजी का उपयोग करता हूं)। उस स्थिति में, मैं ऊपर @ वैन के जवाब पर एक चोटी ले जाऊंगा! – Edwardr

+0

मेरी खराब अंग्रेजी के लिए खेद है। (मुझे 'मेरे बुरे' का अर्थ नहीं पता है और 'चोटी पर ले लो') वास्तव में, @ वैन का जवाब आपके बाद में है। बहुत बहुत धन्यवाद! – Gorthon

1

मैं अन्य उत्तर mysql और का उपयोग कर काम करने के लिए नहीं मिल सका तो कुप्पी के विस्थापित मैं एक के अंदर निम्नलिखित किया माइग्रेशन फ़ाइल।

from app import db 
db.engine.execute("ALTER TABLE myDB.myTable AUTO_INCREMENT = 2000;") 

चेतावनी दीजिये कि यदि आपने अपनी माइग्रेशन फ़ाइलों को पुन: उत्पन्न किया है तो यह अधिलेखित हो जाएगा।