1616from sqlalchemy .ext .declarative import as_declarative , declarative_base , declared_attr
1717from sqlalchemy .ext .declarative .api import DeclarativeMeta
1818from sqlalchemy .orm import scoped_session , sessionmaker
19- from flask .ext .sqlalchemy import SQLAlchemy , _BoundDeclarativeMeta
2019from sqlalchemy import UniqueConstraint ,Column ,Integer ,Text ,String ,Date ,DateTime ,ForeignKey ,func ,create_engine
2120
2221# classproperty decorator
2322class classproperty (object ):
2423 def __init__ (self , getter ):
2524 self .getter = getter
26-
2725 def __get__ (self , instance , owner ):
2826 return self .getter (owner )
2927
3028
31- echo_sql = lambda : os .environ .get ('DATABASE_URI' ) or current_app .config .get ('SQLALCHEMY_ECHO' ,False )
32- get_engine = lambda : create_engine (os .environ .get ('DATABASE_URI' ) or current_app .config ['SQLALCHEMY_DATABASE_URI' ],echo = echo_sql ())
33- Session = lambda e : scoped_session (sessionmaker (bind = e ))
29+ echo_sql = lambda : os .environ .get ('DATABASE_URI' ) and current_app .config .get ('SQLALCHEMY_ECHO' ,False )
30+ get_engine = lambda : create_engine (os .environ .get ('DATABASE_URI' ) or current_app .config ['DATABASE_URI' ],echo = echo_sql ())
3431
35- Model = declarative_base ()
32+ Base = declarative_base ()
3633
3734
3835class SQLAlchemyMissingException (Exception ):
3936 pass
4037
41- class ModelDeclarativeMeta (_BoundDeclarativeMeta ):
42- pass
43-
44- @as_declarative (name = 'BaseMixin' ,metaclass = ModelDeclarativeMeta )
45- class BaseMixin (object ):
38+ class BaseMixin (Base ):
4639 __table_args__ = {
4740 'extend_existing' :True
4841 }
4942 __abstract__ = True
5043 _session = None
51- _e = None
44+ _engine = None
45+ _query = None
5246 _meta = None
5347
5448 def __init__ (self ,* args ,** kwargs ):
5549 super (BaseMixin ,self ).__init__ (* args ,** kwargs )
56- metadata = BaseMixin .metadata or Model .metadata
50+ metadata = BaseMixin .metadata or Base .metadata
5751 self .metadata = BaseMixin .metadata = metadata
5852
5953 @classproperty
60- def _engine (cls ):
61- if cls . _e is None :
62- cls . _e = get_engine ()
63- cls . _e .echo = echo_sql ()
64- return cls . _e
54+ def engine (cls ):
55+ if BaseMixin . _engine is None :
56+ BaseMixin . _engine = get_engine ()
57+ BaseMixin . _engine .echo = echo_sql ()
58+ return BaseMixin . _engine
6559
6660 @declared_attr
6761 def id (self ):
@@ -70,8 +64,14 @@ def id(self):
7064 @classproperty
7165 def session (cls ):
7266 if cls ._session is None :
73- cls ._session = Session (cls ._engine )
74- return cls ._session ()
67+ cls ._session = scoped_session (sessionmaker (bind = cls .engine ))()
68+ return cls ._session
69+
70+ @classproperty
71+ def query (cls ):
72+ if cls ._query is None :
73+ cls ._query = cls .session .query (cls )
74+ return cls ._query
7575
7676 @declared_attr
7777 def __tablename__ (self ):
@@ -116,18 +116,13 @@ def delete(self, commit=True):
116116 self .session .delete (self )
117117 return commit and self .session .commit ()
118118
119- @classproperty
120- def query (cls ):
121- return cls .session .query (cls )
122-
123119 @property
124120 def absolute_url (self ):
125121 return self ._get_absolute_url ()
126122
127123 def _get_absolute_url (self ):
128124 raise NotImplementedError ('need to define _get_absolute_url' )
129125
130-
131126 @classmethod
132127 def get_all_columns (cls ,exclude = ['id' ]):
133128 if not 'id' in exclude :
@@ -156,9 +151,6 @@ def date_added(self):
156151 def date_modified (self ):
157152 return sq .Column (sq .DateTime ,onupdate = dt .now )
158153
159-
160-
161-
162154def _clean_name (name ):
163155 names = name .split ('_' )
164156 if len (names ) > 1 :
0 commit comments