LoginSignup
5
5

More than 5 years have passed since last update.

SQLAlchemy BaseModel

Last updated at Posted at 2012-11-28

お腹すいた

basemodel.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta
from sqlalchemy.orm import sessionmaker, scoped_session
from shimehari.configuration import ConfigManager
from formencode import Invalid

config = ConfigManager.getConfig()
url = 'mysql://' + config['MYSQL_USER'] + ':' + config['MYSQL_PWD'] + '@' + config['MYSQL_HOST'] + '/' + config['MYSQL_NAME'] + '?charset=utf8'
engine = create_engine(url, encoding='utf-8', echo=True)
Session = scoped_session(sessionmaker(autoflush=True, bind=engine))


class Model(object):
    id = Column(Integer, primary_key=True)

    errors = {}
    query = None

    u"""
    インスタンス化済みの Session を使おうとすると
    Session ID がおっかしょなるのでその対策
    """
    @property
    def session(self):
        return self.query.session

    def __init__(self):
        self.schema = None

    def validate(self, attributes):
        try:
            return self.schema.to_python(attributes)
        except Invalid, e:
            self.errors.update(e.error_dict)
            raise

    def publish(self):
        try:
            self.session.add(self)
            self.session.commit()
        except:
            self.session.rollback()
            raise

    def update(self, attributes):
        for k, v in attributes.iteritems():
            setattr(self, k, v)
        self.publish()

    def delete(self):
        try:
            self.session.delete(self)
            self.session.commit()
        except:
            self.sesssion.rollback()
            raise


def session_mapper(cls):
    cls.query = Session.query(cls)


class BaseDeclarativeMeta(DeclarativeMeta):
    def __init__(cls, classname, bases, dict_):
        DeclarativeMeta.__init__(cls, classname, bases, dict_)
        if not Model in bases:
            session_mapper(cls)

BaseModel = declarative_base(engine, metaclass=BaseDeclarativeMeta, cls=Model)
5
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5