Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 组合非唯一外键以创建主键?_Python_Database_Sqlalchemy - Fatal编程技术网

Python 组合非唯一外键以创建主键?

Python 组合非唯一外键以创建主键?,python,database,sqlalchemy,Python,Database,Sqlalchemy,我试图在SQLAlchemy中创建一个表格,将一部电影和一个类别联系起来并给它评分(类别中的惊悚片可能有700分,而类别中的戏剧可能有540分等等) 这意味着该表将包括许多对《光辉》和《颤栗》的引用,但只有一种情况是《光辉》和《颤栗》的结合,其中也包括700分。这幅画很好地说明了这一点 类别和电影是它们自己的类 因此,在搜索答案时,我发现我可以有多个主键,但在这种情况下不起作用,因为主键必须是唯一的,并且电影ID和类别ID不是唯一的 我发现“复合键”这个词听起来像我要找的,但在SQLAlchem

我试图在SQLAlchemy中创建一个表格,将一部电影和一个类别联系起来并给它评分(类别中的惊悚片可能有700分,而类别中的戏剧可能有540分等等)

这意味着该表将包括许多对《光辉》和《颤栗》的引用,但只有一种情况是《光辉》和《颤栗》的结合,其中也包括700分。这幅画很好地说明了这一点

类别和电影是它们自己的类

因此,在搜索答案时,我发现我可以有多个主键,但在这种情况下不起作用,因为主键必须是唯一的,并且电影ID和类别ID不是唯一的

我发现“复合键”这个词听起来像我要找的,但在SQLAlchemy中演示了它似乎不像我想象的那样做

我该怎么做一张我想要的桌子呢?又名图片中的“分类电影分数”? 我之所以不只是创建一个用作主键的常规ID,是因为它永远不会被使用,我只是everu用电影和类别ID查询这个表


提前谢谢

这可以通过以下方法解决。这是一种基于对象的多对多关系,可以存储额外的数据

类关联(基本):
__tablename_uu='association'
movie\u id=列(整数,ForeignKey('movie.id'),primary\u key=True)
category\u id=列(整数,ForeignKey('category.id'),primary\u key=True)
分数=列(整数)
投票数=列(整数)
category=关系(“category”,back_populates=“movies”)
电影=关系(“电影”,背面填充=“类别”)
班级电影(基本):
__tablename_uuu='movie'
id=列(整数,主键=True,自动递增=True)
名称=列(字符串(50))
类别=关系(“关联”,back_populates=“电影”)
类别(基本):
__tablename_uu='category'
id=列(整数,主键=True,自动递增=True)
名称=列(字符串(50))
电影=关系(“关联”,背面填充=“类别”)
使用
sqlite\u autoincrement=True
with在数据库级别创建自动增量

在将类别附加到电影之前,需要将其与关联实例关联:

#创建电影,通过关联附加类别
m=电影()
a=协会(分数=700,投票数=0)
a、 类别=类别()
m、 类别.附加(a)
#通过关联(包括关联)遍历类别对象
#属性
对于m类中的assoc:
打印(关联分数)
印刷品(相关类别)

谢谢,这帮了大忙!将不得不深入挖掘关联对象以了解正在发生的事情。好吧,这似乎可行,但现在我被告知:
列“association.category_id”被标记为表“association”主键的成员,但没有指示Python端或服务器端默认生成器,也不表示“autoincrement=True”或“nullable=True”,也不传递显式值。主键列通常不能存储NULL。请注意,从SQLAlchemy 1.1开始,必须为复合(例如多列)明确指出“autoincrement=True”主键,如果主键中的一列需要自动增量/串行/标识行为。
好的,修复方法是添加
a.movie=m
,因为在关联附加到它时,它似乎不会自动获取电影。不确定原因:(@cobble,我已经更改了答案以消除警告。非常奇怪,你需要设置
a.movie=m
,因为这应该由模型中的
append
处理。我已经在本地对其进行了测试,结果与预期一致,没有设置它。啊,好吧,那么我可能知道为什么会发生这种情况。我正在从另一个数据库导入所有数据我直接设置ID(因此自动增量不起任何作用)。我也认为我需要设置它很奇怪,因为我对表格的理解与您的相同,我将继续使用它,看看是否得到任何不同的结果。谢谢!