Я хочу разобраться с sqlAlchemy. Документацию почитал и примеры
посмотрел — вроде все понятно. Непонятно лишь, как правильно теперь
распределить роди между классами.
Я тут набросал небольшую тестовую программку — знатоки, посмотрите
пожалуйста. В первую очередь интересуют замечания по архитектуре.
Если есть другие — тоже будет интересно услышать:
#! /usr/bin/python
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData,
ForeignKey from sqlalchemy.orm import mapper
from sqlalchemy.orm import sessionmaker
class DatabaseEngine(object):
def sync(self):
self.engine = create_engine('sqlite:///database.db')
self.metadata = MetaData()
product_table = Table('product', self.metadata,
Column('name', String(30), primary_key = True),
Column('category', String(30)),
Column('fat', Integer),
Column('protein', Integer),
Column('carbo', Integer)
)
self.metadata.create_all(self.engine)
mapper(Product, product_table)
def createSession(self):
Session = sessionmaker(bind = self.engine)
session = Session()
return session
class Product(object):
def __init__(self, name, category, fat, protein, carbo):
self.name = name
self.category = category
self.fat = fat
self.protein = protein
self.carbo = carbo
def __repr__(self):
return "<Product(%s, %s, %s, %s, %s)>"%(self.name,
self.category, self.fat, self.protein, self.carbo)
class ProductManager(object):
def __init__(self, engine):
self.engine = engine
def appendProduct(self, product):
session = self.engine.createSession()
session.save(product)
session.commit()
def printProductList(self):
session = self.engine.createSession()
for each_product in session.query(Product):
print each_product.name
engine = DatabaseEngine()
engine.sync() # вызывать один раз при старте программы
manager = ProductManager(engine)
manager.appendProduct(Product('Mill', 1, 2, 3, 4))
manager.printProductList()
Что смущает в данном коде:
1. engine — экземпляр DatabaseEngine создается только один раз — в начале проекта. Но так как он нужен, чтобы порождать сессии — мне придется с этим экземпляром объекта носиться как с писанной торбой, передавая его в различные объекты, требующие работы с БД. Выход — делать синглетон?
2. Перед каждой операцией с субд мне приходится создавать сессию:
session = self.engine.createSession(). То есть практически в каждом
методе. Напрягает.
Posted via RSDN NNTP Server 2.1 beta