[python] - sqlAlchemy
От: DemAS http://demas.me
Дата: 16.09.08 12:37
Оценка:
Я хочу разобраться с 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.