2013-06-26 2 views
7

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

class Client(DeclarativeBase): 

    __tablename__ = 'client' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(
     Integer, 
     ForeignKey('user.id', ondelete='CASCADE'), 
     nullable=False, 
     index=True, 
    ) 



    orgname = Column(Unicode, nullable=False) 

    def __init__(self, **kwargs): 
     super(Client, self).__init__(**kwargs) 

Не я пытаюсь сделать что-то вроде этого

u = User(user_name=u'dusual') 
session.add(u) 
c = Client(user=u, orgname="dummy_org") 
session.add(c) 

Но SQLAlchemy крики обратно, говоря:.

(к, cls_ имя)))) ТипError: «пользователь» является недопустимым аргументом ключевого слова для клиента

Теперь не должно быть ob что пользователь должен быть разрешен как аргумент ключевого слова, как я могу убедиться, что моя таблица может принимать аргумент ключевого слова пользователя.

ответ

15

Вы должны определить relationship между User и Client модели:

от отношений sqlalchemy.orm импорта

class Client(DeclarativeBase): 

    __tablename__ = 'client' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(
     Integer, 
     ForeignKey('user.id', ondelete='CASCADE'), 
     nullable=False, 
     # no need to add index=True, all FKs have indexes 
    ) 
    user = relationship('User', backref='clients') 

    orgname = Column(Unicode, nullable=False) 

    # no need to add a constructor 

Затем вы можете связать экземпляры User и Client модели двумя способами - либо путем назначения целое число до Client.user_id:

u = User(user_name=u'dusual') 
session.add(u) 
session.flush() # to make sure the id is fetched from the database 
c = Client(user_id=u.id, orgname="dummy_org") 
session.add(c) 

или путем определения экземпляра User до Client.user.

u = User(user_name=u'dusual') 
# no need to flush, no need to add `u` to the session because sqlalchemy becomes aware of the object once we assign it to c.user 
c = Client(user=u, orgname="dummy_org") 
session.add(c) 

На самом деле, есть третий путь - так как мы настроили backref на Client.user, SQLAlchemy добавил список-как clients атрибут нашей User модели:

u = User(user_name=u'dusual') 
u.clients.append(Client(orgname="dummy_org")) 
session.add(u) 
+1

Ну Явное декларирование Взаимоотношений работы , Но мне было интересно, есть ли неявный способ, в котором это работает, потому что, похоже, он работает для некоторого кода, который я искал для справки. – dusual

+0

nicee :) хорошо выдохся – deeshank

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