使用检查确定关系类型

2024-04-25 23:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要确定一种关系类型是否是一对一的。你知道吗

在我的用例中,第三方开发人员能够将具有一对一关系的新表(例如Manager和/或Worker)添加回主表(这里称为Person)。它们还可能添加一对多的新表;我需要忽略这些表。你知道吗

以下代码段:

from sqlalchemy import * 
from sqlalchemy.orm import *
from sqlalchemy.ext.automap import automap_base

e = create_engine("sqlite://", echo=True)
e.execute(""" 
     create table person (id integer primary key) 
""") 
e.execute(""" 
     create table manager (id integer primary key, person_id integer,
     FOREIGN KEY(person_id) REFERENCES person(id)) 
""") 
e.execute(""" 
     create table worker (id integer primary key, person_id integer,
     FOREIGN KEY(person_id) REFERENCES person(id)) 
""") 

Base = automap_base() 

class Person(Base): 
    __tablename__ = 'person' 
    id = Column(Integer, primary_key=True) 

class Manager(Base): 
    __tablename__ = 'manager' 
    id = Column(Integer, primary_key=True)
    person_id = Column(Integer, ForeignKey('person.id'))
    person = relationship("Person", uselist=False)

class Worker(Base): 
    __tablename__ = 'worker' 
    id = Column(Integer, primary_key=True)
    person_id = Column(Integer, ForeignKey('person.id'))
    person = relationship("Person", uselist=False)

class WorkerUnion(Base):
    __tablename__ = 'worker_union' 
    id = Column(Integer, primary_key=True)
    person_id = Column(Integer, ForeignKey('person.id'))
    person = relationship("Person", uselist=True)    

Base.prepare(e) 

for r in inspect(Person).relationships:
    print(f"{r.target.name}, {r.uselist}, {r.collection_class}")

输出:

manager, True, <class 'list'>
worker, True, <class 'list'>
worker_union, True, <class 'list'>

当我为manager/worker关系指定uselist=False时,我发现这很混乱。你知道吗

我显然遗漏了一些东西,有没有一种方法可以通过inspect来确定每个类的关系的性质?你知道吗


Tags: keyidtruebase关系createcolumninteger
2条回答

我使用以下代码来确定关系类型。我还添加了确定是多对多关系还是多对一关系的方法,因为我通常必须基于该条件执行。以个人为例:

from sqlalchemy.orm.interfaces import MANYTOMANY, MANYTOONE
from sqlalchemy import inspect

for relationship in inspect(Person).relationships:
  direction = relationship.direction
  print(direction)

  if direction == MANYTOMANY:
    # execute some code
  elif direction == MANYTOONE:
    # execute some other code

谢谢你的建议和回答。你知道吗

似乎诀窍是在每个关系中查看每个已发现实体的关系。例如:

for r in inspect(Person).relationships:
    for s in inspect(r.entity.entity).relationships:
        if s.entity.entity == Person:
            print(f"{r.target.name}, {s.uselist}, {s.collection_class}")

相关问题 更多 >