2013-12-12 3 views
2

Вопрос о синтаксисе, связанном с SQLAlchemy.Связь с базой данных - синтаксис

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child_id = Column(Integer, ForeignKey('child.id')) 
    child = relationship("Child") 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 

Почему это ForeignKey ('child.id'), а не ForeignKey ("Child.id")? Почему это отношения («Ребенок»), а не отношения («ребенок»)? Есть ли что-то фундаментальное в том, как работают базы данных и SQLAlchemy, которые я не понимаю, и почему я должен задать этот вопрос? Благодаря!

ответ

2

relationship(Child) также действителен. Капитализируя внутри строки, sqlalchemy будет искать соответствующую модель.

Отношения не являются стандартом sql, поэтому SQLAlchemy использует свое собственное соглашение, тогда как ForeignKey является стандартом SQL, поэтому используется tablename.column.

2

В общем: A relationship определена на уровне orm в то время как ForeignKey представляет собой модель базы данных. Теперь это может быть так, что sqlalchemy достаточно умен, чтобы рисовать от другого, но если вы храните это разделение в разуме, вы в безопасности.

В частности, на ваш вопрос: просто прочитайте документацию. Извлечение ниже (стенографический)

аргумента - отображенный класса, или фактический экземпляр Mapper, представляющее цели отношений.

аргумент может также быть передан в качестве вызываемой функции, которая вычисляется в картографа время инициализации, и может быть передан в качестве Python-оцениваемой строки при использовании декларативного.

колонка - Один целевой столбец для ключа отношений. A Столбец объект или название столбца в виде строки: tablename.columnkey или schema.tablename.columnkey. columnkey - это ключ, который был назначен , назначенный столбцу (по умолчанию используется имя столбца), если только link_to_name не является True, и в этом случае используется отображаемое имя столбца: .

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