Хм, название было сложнее сформулировать, чем я думал.
По сути, эти простые классы сопоставлены с таблицами с использованием SQLAlchemy. Я знаю, что им не хватает нескольких предметов, но они не важны для освещения проблемы.
class Customer(object):
def __init__(self, uid, name, email):
self.uid = uid
self.name = name
self.email = email
def __repr__(self):
return str(self)
def __str__(self):
return "Cust: %s, Name: %s (Email: %s)" %(self.uid, self.name, self.email)
Выше приведен простой клиент с идентификатором, именем и адресом электронной почты.
class Order(object):
def __init__(self, item_id, item_name, customer):
self.item_id = item_id
self.item_name = item_name
self.customer = None
def __repr__(self):
return str(self)
def __str__(self):
return "Item ID %s: %s, has been ordered by customer no. %s" %(self.item_id, self.item_name, self.customer)
Это класс Orders
, который просто содержит информацию о заказе: идентификатор, имя и ссылку на клиента. Он инициализирован на None
, чтобы указать, что у этого товара еще нет покупателя. Работа по коду назначит товар клиенту.
Следующий код отображает эти классы в соответствующие таблицы базы данных.
# SQLAlchemy database transmutation
engine = create_engine('sqlite:///:memory:', echo=False)
metadata = MetaData()
customers_table = Table('customers', metadata,
Column('uid', Integer, primary_key=True),
Column('name', String),
Column('email', String)
)
orders_table = Table('orders', metadata,
Column('item_id', Integer, primary_key=True),
Column('item_name', String),
Column('customer', Integer, ForeignKey('customers.uid'))
)
metadata.create_all(engine)
mapper(Customer, customers_table)
mapper(Order, orders_table)
Теперь, если я сделаю что-то вроде:
for order in session.query(Order):
print order
Я могу получить список заказов в этой форме:
Item ID 1001: MX4000 Laser Mouse, has been ordered by customer no. 12
Что я хочу сделать, так это узнать имя и адрес электронной почты клиента 12 (вот почему я использовал ForeignKey в таблице Customer). Как бы я пошел об этом?
Обновлено на основе моего комментария
Я знаю, что это кажется немного бесполезным, но просто ради знания: что мне нужно сделать, чтобы сохранить отношения однонаправленными?
Кроме того, если бы у меня был другой внешний ключ в другой таблице? Как бы я обновил маппер?