2012-06-23 2 views
9

Я использую flask-sqlalchemy построить веб-приложение, и я следующая модель (ы):Композитные ключи в 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) 

Я полностью нуб, когда дело доходит до проектирования баз данных, так что я буду действительно оценить несколько советов о некоторых основных запросов у меня есть

  • нужно ли id столбец? Большинство учебных пособий, которые я видел, имеют это как столбец (в основном, первичный ключ). Могу ли я обойтись без этого? Особенно в тех случаях, когда у меня есть еще один первичный ключ?

  • Как у меня есть ограничение составного ключа на столбцы # кандидата и кандидата # post_id, учитывая, что post_id является внешним ключом.

  • Как я могу «обновить» мою базу данных. После внесения изменений в модель, как я могу убедиться, что эти изменения отражены в фактических таблицах? Нужно ли мне drop_all и create_all вручную?

  • И, наконец, распространяется ли документа sqlalchemy на flask-sqlalchemy?

+2

Вы можете разделить эти вопросы; вам становится труднее дать людям ответы на вопросы при публикации нескольких вопросов в одном вопросе. Вся документация 'sqlalchemy' относится к' flask-sqlalchemy'. –

ответ

20

нужно ли столбец ID? Большинство учебных пособий, которые я видел, имеют это как столбец (в основном, первичный ключ). Могу ли я обойтись без этого? Особенно в тех случаях, когда у меня есть еще один первичный ключ?

Для стол почты, да. Для другого нет. Некоторые могут утверждать, что поскольку имя уникально, сделайте его первичным ключом, но это будет означать использование имени в любом месте, вам нужно ссылаться на это сообщение, что означает больше места (длина имени против 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 в.

Да, что отличается, это способ доступа к модели и сессии, и двигатель и ... Например, в SQLAlchemy:

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

И в колбах-SQLAlchemy:

db.session.commit() 

А для "модели":

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

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

и т.д ...

Во всяком случае, что вы делаете в sqlalchemy, вы делаете это один раз, и фляга-sqlalchemy делает это для вас в фоновом режиме.

Надеется, что это помогает :) (и это гораздо больше, чем один вопрос о составных ключах в SQLAlchemy ...)

+0

soooo ... Как вы добавляете составные клавиши? –

+0

@PiotrKamoda Если вам нужен составной первичный ключ, просто установите 'primary_key = True' для всех полей первичного ключа. Или используйте что-то похожее на 'UniqueConstraint (« id »,« кандидат_ид »)' в '__table_args__'. Вы можете даже указать более сложные первичные ключи в табличных аргументах. – jadkik94

Смежные вопросы