如何对两个表进行基本联接?

2024-09-29 17:20:24 发布

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

我正在学习SQLAlchemy,在做看似简单的操作时遇到了困难。请原谅我,如果我的问题是原始的和基本的,但我不能为我的生活,我不知道如何基本上连接我的两个表。你知道吗

我的桌子是这样的:

class User(Base):

    """ Basic User definition """

    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(Unicode(255))
    email = Column(Unicode(255), unique=True)
    username = Column(Unicode(255), unique=True)
    _password = Column('password', Unicode(60))

    contacts = relationship('Contact', backref='users')
    contact_groups = relationship('ContactGroups', backref='users')
    contact_group_users = relationship('ContactGroupUsers', backref='users')

class Contact(Base):

    __tablename__ = 'contacts'

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer)
    contact_id = Column(Integer)

    __table_args__ = (ForeignKeyConstraint([contact_id], [User.id]), {})

class ContactGroups(Base):

    __tablename__ = 'contact_groups'

    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('users.id'))
    group_name = Column(Unicode(255))

    contact_group_users = relationship('ContactGroupUsers', backref='contact_groups')

class ContactGroupUsers(Base):

    __tablename__ = 'contact_group_users'

    id = Column(Integer, primary_key=True)
    group_id = Column(Integer, ForeignKey('contact_groups.id'))
    user_id = Column(Integer, ForeignKey('users.id'))

我有我的主User表。用户可以将其他用户添加为Contact。为了帮助组织这些联系人,他们可以创建ContactGroups。你知道吗

Contact.user_idContact.contact_id都应该是User.id的外键。你知道吗

ContactGroupUsers.group_idContactGroup.id的外键 每个ContactGroupUser.user_id都是返回到该用户的User.id的外键。 (也许这是一个可怕的方式…也许是,但我正在学习。无论如何。)

当我查询特定组中存在的联系人时,我想检索filter(ContactGroupUsers.group_id == group_id).all()所在的所有行,然后从中,将每个ContactGroupUsers.user_id连接到Contact表中该用户的条目。因此,我最终得到的结果是:

ContactGroupUsers.group_id | (and then the information present in the contacts table for that user)

那么,我的最后一个问题是,如何基于User.id连接我的两个表ContactGroupUsersContacts?或者,如果有一个内在的优越的方法来做这件事,请给我指出正确的方向,这样我至少可以适当地学习。你知道吗

谢谢你的帮助。非常感谢。你知道吗


Tags: idtruebaseunicodegroupcontactcolumninteger
1条回答
网友
1楼 · 发布于 2024-09-29 17:20:24

由于要将多个外键定义回User中的Contact,因此最好按以下方式定义它们:

from sqlalchemy.ext.associationproxy import association_proxy

class User( Base ):

    __tablename__       = 'user'

    id                  = Column( Integer, primary_key=True )

    contacts            = relationship( 'Contact',
        primaryjoin = 'foreign( User.id )=remote( Contact.user_id )',
        backref     = 'user'
    )
    contact_groups      = relationship( 'ContactGroup', backref='user' )
    contact_group_users = relationship( 'ContactGroupUsers', backref='user' )

    contact_users = association_proxy( 'contacts', 'contact' )

class Contact( Base ):

    __tablename__       = 'contact'

    id                  = Column( Integer, primary_key=True )

    user_id             = Column( Integer, ForeignKey( 'user.id' ) )
    contact_id          = Column( Integer, ForeignKey( 'user.id' ) )

    contact             = relationship( 'User',
        primaryjoin = 'foreign( Contact.contact_id ) = remote( User.id )',
        backref     = 'user_contacts'
    )

class ContactGroup( Base ):

    __tablename__       = 'contact_group'

    id                  = Column( Integer, primary_key=True )

    user_id             = Column( Integer, ForeignKey( 'user.id' ) )

class ContactGroupUser( Base ):

    __tablename__       = 'contact_group_user'

    id                  = Column( Integer, primary_key=True )

    group_id            = Column( Integer, ForeignKey( 'contact_group.id' ) )
    user_id             = Column( Integer, ForeignKey( 'user.id' ) )

    contact_group       = relationship( 'ContactGroup' )

以这种格式建立关系可能有点复杂,涉及到aliased实例的用户。例如,您可以进行如下查询,指出某个组id下给定用户的所有联系人:

original_user = aliased( User )

contacts = db.session.query( User )\
    .join( User.user_contacts )\
    .join( original_user, original_user.id == Contact.user_id )\
    .join( User.contact_group_users )\
    .join( ContactGroupUser.contact_groups ).filter(
        and_(
             original_user.id == user_id,
             contact_group.user_id == original_user.id,
             contact_group.group_id == group_id
        )
     ).all()

相关问题 更多 >

    热门问题