Как установить связь между таблицами с помощью SQLAlchemy? - PullRequest
1 голос
/ 07 февраля 2010

Используя 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

Ответы [ 2 ]

3 голосов
/ 07 февраля 2010

Используйте функцию отношения sqlalchemy:

http://www.sqlalchemy.org/docs/ormtutorial.html#building-a-relation

1 голос
/ 07 февраля 2010

Это должно работать для вас:

mapper (Player, Players_table, Properties = {'location' = отношение (Location, uselist = False, backref = backref ('Players'))})

Таким образом, вы можете получить доступ к местоположению напрямую, так как у вас не будет списка. Кроме этого, вы можете создавать location.players, которые вернут вам InstrumentedList, так что вы можете пересматривать игроков

...