ere*_*eOn 11 python database sqlalchemy flask flask-sqlalchemy
我正在编写一个Flask/SQLAlchemy应用程序,其中包含用户和组.
用户可以属于多个组,并且每个组中都有唯一的编号.询问如何建模数据库我被建议使用以下表结构来实现我的多对多关系:
TABLE UserGroups
GroupID
UserID
UserNumber
PRIMARY KEY (GroupID, UserID)
UNIQUE (GroupID, UserNumber)
FOREIGN KEY (GroupID)
REFERENCES Groups (GroupID)
FOREIGN KEY (UserID)
REFERENCES Users (UserID)
Run Code Online (Sandbox Code Playgroud)
现在我知道如何与SQLAlchemy建立常规的多对多关系,但我不知道如何UNIQUE用附加UserNumber字段表示约束.
我没有很多数据库设计,ORM和SQLAlchemy的经验,所以这可能是显而易见的,但我找不到表达它的方法.
关于我没有得到的东西是:使用常规的多对多关系,我的User类有一个类似列表的属性groups,其中包含他所属的所有组,但这完全隐藏了UserGroups加入表,我不知道我知道如何访问该UserNumber领域.
这对我来说有点模糊.你对SQLAlchemy如何做这样的事情有什么好的例子或解释吗?
use*_*462 22
对于像我一样来这里只是为了找到一个工作片段来设置独特约束的人:
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, UniqueConstraint
Base = declarative_base()
class Model(Base):
__tablename__ = "model"
model_id = Column(Integer, primary_key=True)
# will create "model_num_key" UNIQUE CONSTRAINT, btree (num)
num = Column(Integer, unique=True)
# same with UniqueConstraint:
num2 = Column(Integer)
__table_args__ = (UniqueConstraint("num2", name="model_num2_key"),)
# for multiple columns:
# __table_args__ = (UniqueConstraint("num", "num2", name="two_columns"),)
Run Code Online (Sandbox Code Playgroud)
问题的第一部分(关于创建具有多列的唯一约束)已经由cleg回答.
但是,如果要在映射表中另外添加列,则默认的多对多方法不起作用.相反,您应该使用关联对象模式.此外,您可以使用association_proxy简化用户和组之间的访问.
在proxied_association.py从SQLAlchemy的例子应该是一个很好的起点.
UniqueConstraint在您的模型中使用.详细描述了这个问题:sqlalchemy在多个列中是唯一的
对于多对多关系,SQLAlchemy有很好的教程.
PS对不起,我错过了第二部分的回答(它比我想的更复杂,所以请看@schlamar的答案),但第一部分仍然是正确的.
| 归档时间: |
|
| 查看次数: |
30400 次 |
| 最近记录: |