如何使用sqlalchemy创建外键引用

dus*_*ual 12 python sqlalchemy pyramid

嗨,我无法理解如何使用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)
Run Code Online (Sandbox Code Playgroud)

不是我想做这样的事情

 u = User(user_name=u'dusual')
 session.add(u)
 c = Client(user=u, orgname="dummy_org")
 session.add(c)
Run Code Online (Sandbox Code Playgroud)

但是sqlalchemy喊道:

(K,cls_.))类型错误:"用户"是用于客户端无效的关键字参数

现在不应该明白,应该允许用户作为关键字参数,我如何确保我的表能够采用用户关键字参数.

Ser*_*gey 26

您需要定义和模型之间的关系:UserClient

来自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 
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过两种方式关联UserClient模型的实例- 通过将整数分配给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)
Run Code Online (Sandbox Code Playgroud)

或通过协助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)
Run Code Online (Sandbox Code Playgroud)

实际上,还有第三种方法 - 自从我们配置了backrefon Client.user,SQLAlchemy clients为我们的User模型添加了类似列表的属性:

u = User(user_name=u'dusual')
u.clients.append(Client(orgname="dummy_org"))
session.add(u)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,是否自动为您创建外键索引取决于您使用的数据库。对于 sqlite3,它不会自动为您创建,但强烈建议您这样做。 (2认同)