我将一堆专利数据存储在MySQL数据库中,并通过SQLAlchemy与它进行交互.我在专利类中有一个代表受让人名单(被指定专利的公司)的集合:
assignees = relationship('Company', secondary=patent_company_table, backref='patents')
Run Code Online (Sandbox Code Playgroud)
我正在处理存储在数据库中的一些对象,对于专利对象p,我想a从p收件人列表中删除一些受让人(公司对象).基于http://docs.sqlalchemy.org/en/latest/orm/session.html#deleting-from-collections,似乎调用s.delete(a)实际上将删除Company对象a.我只是想从受让人a列表中删除受让人p(即删除patent_company_table中的一行),而不是实际删除Company对象,因为a可能在另一个Patent对象的受让人列表中.
我试图创建一个新的名单new_assignees只包括从受让人p除a然后叫:
p.assignees = new_assignees
s.add(p)
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这实际上并没有标记p为脏,所以我认为它不会影响数据库.
您对如何从集合中删除对象有任何建议,删除patent_company_table中的行而不是从Company表中删除对象?
谢谢.
以下是代码片段:
assignees = patent.assignees
for assignee in assignees:
if assignee in duplicate_company_to_default:
patent.assignees.remove(assignee)
default_company = duplicate_company_to_default[assignee]
if default_company not in assignees:
added_patent_count += 1
patent.assignees.append(default_company)
Run Code Online (Sandbox Code Playgroud)
循环完所有专利后,added_patent_count = 983672但没有任何对象session.dirty().通过append或修改后,是否需要手动添加到会话中remove?
这是我当前的数据库结构:
Col1 Col2
1 abc123
1 abc123
1 def321
2 xyz789
2 xyz789
Run Code Online (Sandbox Code Playgroud)
我想确保 中的任何条目Col2仅用于 中的相同条目Col1。例如,数据库允许您添加这一行:
Col1 Col2
2 lmn456
Run Code Online (Sandbox Code Playgroud)
但不是这个:
Col1 Col2
2 abc123
Run Code Online (Sandbox Code Playgroud)
有没有办法通过唯一索引来强制执行此操作?通常,唯一性强制特定组合对于整个表来说是唯一的(即(1,abc123)仅出现一次)。
我无法移动Col2到不同的表并使用联接,因为我需要支持Col2每个条目的多个值Col1- 它不是一对一的。