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)
然后,您可以通过两种方式关联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)
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)