2012-06-23 13 views
9

मैं flask-sqlalchemy उपयोग कर रहा हूँ एक webapp के निर्माण के लिए समग्र कुंजी और मैं निम्नलिखित है मॉडल (ओं):SQLAlchemy

class Post(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(80), unique=True) 
    candidates = db.relationship('Candidate', backref='post', lazy='dynamic') 

    def __init__(self, name): 
     self.name = name 

    def __repr__(self): 
     return "<Post %r>" % self.name 

class Candidate(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(80), primary_key=True) 
    post_id = db.Column(db.Integer, db.ForeignKey('post.id')) 
    hostel = db.Column(db.String(80)) 
    yes_no = db.Column(db.Boolean) 
    #votes = db.relationship('Vote', backref='vote', lazy="dynamic") 

    def __init__(self, name, hostel, post_id, yes_no): 
     self.name = name 
     self.hostel = hostel 
     self.post_id = post_id 
     self.yes_no = yes_no 

    def __repr__(self): 
     return "<Candidate: %r, Post: %r>" % (self.name, self.post.name) 

जब यह डेटाबेस डिजाइन करने के लिए आता मैं पूरी तरह noob हूँ, इसलिए मैं वास्तव में हूँ कुछ बुनियादी प्रश्नों मैं

  • है के बारे में कुछ संकेत दिए गए सराहना id स्तंभ आवश्यक है? मैंने देखा है कि अधिकांश ट्यूटोरियल में एक कॉलम (विशेष रूप से प्राथमिक कुंजी) के रूप में है। क्या मैं इसके बिना कर सकता हूँ? खासकर उन मामलों में जहां मेरे पास एक और प्राथमिक कुंजी है?

  • उम्मीदवार # नाम और अभ्यर्थी # post_id कॉलम पर एक समग्र कुंजी बाधा कैसे हो सकती है, यह देखते हुए कि post_id एक विदेशी कुंजी है।

  • मैं अपने डेटाबेस को "रीफ्रेश" कैसे कर सकता हूं। मॉडल में बदलाव करने के बाद, मैं यह कैसे सुनिश्चित कर सकता हूं कि उन परिवर्तनों को वास्तविक तालिकाओं में दिखाई दे? क्या मुझे मैन्युअल रूप से drop_all और create_all की आवश्यकता है?

  • आखिरकार, sqlalchemy प्रलेखन flask-sqlalchemy पर भी लागू होता है?

+2

आपको इन प्रश्नों बाहर विभाजित करना चाहते हो सकता है; आप एक प्रश्न में कई मुद्दों को पोस्ट करते समय लोगों को जवाब देने के लिए कठिन बना रहे हैं। 'Sqlalchemy' प्रलेखन' फ्लास्क-स्क्लेल्चेमी 'पर भी लागू होता है। –

उत्तर

20

आईडी स्तंभ आवश्यक है? मैंने देखा है कि अधिकांश ट्यूटोरियल में एक कॉलम (विशेष रूप से प्राथमिक कुंजी) के रूप में है। क्या मैं इसके बिना कर सकता हूँ? खासकर उन मामलों में जहां मेरे पास एक और प्राथमिक कुंजी है?

पोस्ट तालिका के लिए, हाँ। दूसरे के लिए, नहीं। कुछ लोग तर्क दे सकते हैं कि चूंकि नाम अद्वितीय है, इसे प्राथमिक कुंजी बनाएं, लेकिन इसका अर्थ यह होगा कि कहीं भी का उपयोग करें, आपको उस पोस्ट को संदर्भित करने की आवश्यकता है, जिसका अर्थ है अधिक जगह (नाम बनाम int की लंबाई) (आवश्यक रूप से कोई समस्या नहीं है)) और "क्या उम्मीदवार का नाम बदलता है?" के बारे में सोचें। हालांकि, आपको निश्चित रूप से दोनों की आवश्यकता नहीं है।

उम्मीदवार # नाम और अभ्यर्थी # post_id कॉलम पर एक समग्र कुंजी बाधा कैसे हो सकती है, यह देखते हुए कि post_id एक विदेशी कुंजी है।

आप यह कैसे कर रहे हैं, प्रत्येक पोस्ट एक ही पोस्ट करने के लिए असाइन किया गया है:

candidates = db.relationship('Candidate', backref='post', lazy='dynamic') 

तो, क्षेत्र समझ बनाने के लिए candidates लेकिन candidate नहीं बुलाया जाना चाहिए।

आपके प्रश्न का उत्तर करने के लिए, मैं the docs से बोली जाएगा:

बाधा/सूचकांक में एकाधिक स्तंभों निर्दिष्ट करने के लिए या एक स्पष्ट नाम निर्दिष्ट करने, UniqueConstraint का उपयोग करें या सूचकांक स्पष्ट निर्माण करती है।

आप अपने मॉडल परिभाषा में जोड़ने के लिए की आवश्यकता होगी:

__table_args__ = (
     UniqueConstraint("id", "candidate_id"), 
    ) 

हालांकि मुझे लगता है कि इसे यहाँ बेकार है (आप यह क्यों की आवश्यकता है यदि आईडी अद्वितीय (प्राथमिक कुंजी है), तो किसी भी अन्य संयोजन इसमें यह अद्वितीय होगा) ...

मैं अपने डेटाबेस "रीफ्रेश करें" कर सकते हैं। मॉडल में बदलाव करने के बाद, मैं कैसे सुनिश्चित कर सकता हूं कि वे परिवर्तन वास्तविक तालिकाओं में दिखाई दे रहे हैं? क्या मुझे मैन्युअल रूप से drop_all और create_all की आवश्यकता है?

आपको डेटाबेस में commit आपके परिवर्तनों की आवश्यकता है। flask-sqlalchemy's documentation से:

db.session.add(post) 
db.session.commit() 

अन्त में, SQLAlchemy प्रलेखन साथ ही कुप्पी के SQLAlchemy लागू होता है?

नोट यह वही है मैं अपने खुद के, कोई "आधिकारिक" स्रोत पर पता चला, बस कुप्पी के SQLAlchemy के स्रोत को पढ़ कर रहा है।

from sqlalchemy.orm import sessionmaker 
Session = sessionmaker() 
session = session() 
session.commit() 

और कुप्पी के SQLAlchemy में:

db.session.commit() 

हाँ, क्या अलग है, आप मॉडल और सत्र और इंजन और एक्सेस करने के उदाहरण के लिए, SQLAlchemy में है ...

और "मॉडल" के लिए:

# In sqlalchemy 
Base = declarative_base() 
class Post(Base): 
    # ... 

# In flask-sqlalchemy 
class Post(db.Model): 
    # ... 

आदि ...

012,

वैसे भी, क्या आप SQLAlchemy तरह से करते हैं, आप इसे एक बार करते हैं, और कुप्पी के SQLAlchemy आपके लिए पृष्ठभूमि में यह होता है।

आशा है कि यह मदद करता है :) (और इतना SQLAlchemy में समग्र कुंजियों के बारे में एक से अधिक सवाल है ...)

+0

soooo ... आप समग्र कुंजी कैसे जोड़ते हैं? –

+0

@PiotrKamoda यदि आपको एक समग्र प्राथमिक कुंजी की आवश्यकता है, तो बस सभी प्राथमिक कुंजी फ़ील्ड में 'primary_key = True' सेट करें। या '__table_args__' में' UniqueConstraint ("id", "candidate_id") के समान कुछ उपयोग करें। आप तालिका तर्कों में अपनी जटिल प्राथमिक कुंजी भी निर्दिष्ट कर सकते हैं। – jadkik94