在SQLAlchemy ORM中实现自引用多对多关系,并引用相同的属性,可以通过以下步骤实现:
User
的模型类来表示用户,其中包含一个自引用的多对多关系friends
,并引用相同的属性name
。from sqlalchemy import Column, Integer, String, Table, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
friends_association_table = Table('friends_association', Base.metadata,
Column('user_id', Integer, ForeignKey('users.id')),
Column('friend_id', Integer, ForeignKey('users.id'))
)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
friends = relationship('User', secondary=friends_association_table,
primaryjoin=id==friends_association_table.c.user_id,
secondaryjoin=id==friends_association_table.c.friend_id,
backref='friends')
Session
类来创建会话。from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('数据库连接字符串')
Session = sessionmaker(bind=engine)
session = Session()
Base.metadata.create_all(engine)
方法来创建所有定义的模型类对应的表。Base.metadata.create_all(engine)
# 创建用户
user1 = User(name='User 1')
user2 = User(name='User 2')
user3 = User(name='User 3')
# 建立关系
user1.friends.append(user2)
user1.friends.append(user3)
user2.friends.append(user3)
# 提交到数据库
session.add_all([user1, user2, user3])
session.commit()
# 查询用户的朋友列表
user = session.query(User).filter_by(name='User 1').first()
friends = user.friends
for friend in friends:
print(friend.name)
这样,我们就实现了在SQLAlchemy ORM上实现自引用多对多关系,并引用相同的属性。在实际应用中,可以根据具体需求进行适当调整和扩展。
领取专属 10元无门槛券
手把手带您无忧上云