【问题标题】:How to make a relation between tables using SQLAlchemy?如何使用 SQLAlchemy 在表之间建立关系?
【发布时间】:2010-02-07 13:27:31
【问题描述】:

使用 SQLAlchemy,给定如下表:

locations_table = Table('locations', metadata,
    Column('id',        Integer, primary_key=True),
    Column('name', Text),
)

players_table = Table('players', metadata,
    Column('id',                 Integer, primary_key=True),
    Column('email',           Text),
    Column('password',   Text),
    Column('location_id',  ForeignKey('locations.id'))
)

以及诸如此类的类:

class Location(object):
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Location: %s, %s>' % (self.name)

mapper(Location, locations_table)

class Player(object):
    def __init__(self, email, password, location_id):
        self.email = email
        self.password = password
        self.location_id = location_id

    def __repr__(self):
        return '<Player: %s>' % self.email

mapper(Player, players_table)

和这样的代码:

location = session.query(Location).first()
player = session.query(Player).first()

(简化)。

我将如何修改它以支持诸如此类的操作:

# assign location to player using a Location object, as opposed to an ID
player.location = location
# access the Location object associated with the player directly
print player.location.name

如果 SQLAlchemy 允许:

# print all players having a certain location
print location.players

?

【问题讨论】:

    标签: python orm sqlalchemy relation


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      这应该适合你:

      mapper(Player, player_table, properties={'location'=relation(Location, uselist=False, backref=backref('players'))})

      这样您就可以直接访问该位置,因为您不会获得列表。除此之外,您可以使用 location.players 来返回 InstrumentedList,这样您就可以遍历播放器

      【讨论】:

        猜你喜欢
        • 2023-03-18
        • 2017-07-09
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2021-10-22
        • 2019-01-20
        相关资源
        最近更新 更多