Changeset 129 for projects/sAsync/trunk
- Timestamp:
- 03/23/08 01:03:06 (5 months ago)
- Files:
-
- projects/sAsync/trunk/sasync/database.py (modified) (4 diffs)
- projects/sAsync/trunk/sasync/items.py (modified) (1 diff)
- projects/sAsync/trunk/sasync/test/test_database.py (modified) (7 diffs)
- projects/sAsync/trunk/sasync/test/test_orm.py (modified) (5 diffs)
- projects/sAsync/trunk/setup.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
projects/sAsync/trunk/sasync/database.py
r128 r129 28 28 from twisted.internet import defer 29 29 from twisted.python import failure 30 30 31 import sqlalchemy as SA 31 from sqlalchemy.orm import create_session 32 33 ###################################################################### 34 # SA 0.4 support contributed by Ricky Iacovou, based upon: 35 # 36 # http://www.sqlalchemy.org/docs/04/intro.html#overview_migration 37 # 38 # Determine the version of SQLAlchemy used, 0.3 or 0.4, and set the 39 # Boolean variable "SA04" accordingly. 40 # 41 # We could also use a capability-based approach, like: 42 # 43 # try: 44 # MetaData = SA.BoundMetaData 45 # except AttributeError: 46 # MetaData = SA.MetaData 47 # 48 # However, late 0.3.x versions also supported some 0.4 constructs, 49 # so better use an explicit 0.3.x -> 0.4.x cutoff in order to avoid 50 # ambiguity. 51 ###################################################################### 52 _sv = SA.__version__.split ('.') 53 try: 54 _v = int (_sv[0]) + (int(_sv[1]) / 10.0) 55 except: 56 # Not strictly an Import Error, but close enough. 57 raise ImportError("Failed to determine SQLAlchemy version: %s", _sv) 58 if _v >= 0.4: 59 SA04 = True 60 else: 61 SA04 = False 62 del _sv, _v 63 # End of version check 64 32 65 33 66 from asynqueue import ThreadQueue … … 287 320 def createEngine(): 288 321 url, kw = self.engineParams 322 # The 'threadlocal' keyword value is unchanged from SA 0.3 to 0.4 289 323 kw['strategy'] = 'threadlocal' 290 324 return SA.create_engine(url, **kw) … … 331 365 """ 332 366 def gotConnection(connection): 333 d = self.q.call(create_session, connection, doNext=True) 367 if SA04: 368 d = self.q.call( 369 SA.orm.create_session, bind=connection, doNext=True) 370 else: 371 d = self.q.call( 372 SA.create_session, bind_to=connection, doNext=True) 334 373 d.addCallback(gotSession) 335 374 return d … … 360 399 def _table(): 361 400 if not hasattr(self, '_meta'): 362 self._meta = SA.MetaData(self._engine) 401 if SA04: 402 self._meta = SA.MetaData(self._engine) 403 else: 404 self._meta = SA.BoundMetaData(self._engine) 363 405 indexes = {} 364 406 for key in kw.keys(): projects/sAsync/trunk/sasync/items.py
r3 r129 141 141 self.sasync_items.delete( 142 142 SA.and_(items.c.group_id == self.groupID, 143 items.c.name.in_( *names))).execute()143 items.c.name.in_(names))).execute() 144 144 145 145 @transact projects/sAsync/trunk/sasync/test/test_database.py
r3 r129 85 85 'people', 86 86 Column('id', Integer, primary_key=True), 87 Column('name_first', String ),88 Column('name_last', String ))87 Column('name_first', String(32)), 88 Column('name_last', String(32))) 89 89 d.addCallbacks(self.insertions, self.oops) 90 90 return d … … 172 172 'people', 173 173 Column('id', Integer, primary_key=True), 174 Column('name_first', String ),175 Column('name_last', String ))174 Column('name_first', String(32)), 175 Column('name_last', String(32))) 176 176 return d 177 177 … … 333 333 'very_cool_table', 334 334 Column('id', Integer, primary_key=True), 335 Column('Whatever', String ))335 Column('Whatever', String(32))) 336 336 337 337 def gotTable(table): … … 353 353 'singleton', 354 354 Column('id', Integer, primary_key=True), 355 Column('foobar', String ))355 Column('foobar', String(32))) 356 356 return DeferredList([create(), create()]) 357 357 … … 361 361 'table_indexed', 362 362 Column('id', Integer, primary_key=True), 363 Column('foo', String ),364 Column('bar', String ),363 Column('foo', String(32)), 364 Column('bar', String(64)), 365 365 index_foobar=['foo', 'bar'] 366 366 ) … … 374 374 'table_unique', 375 375 Column('id', Integer, primary_key=True), 376 Column('foo', String ),377 Column('bar', String ),376 Column('foo', String(32)), 377 Column('bar', String(64)), 378 378 unique_foobar=['foo', 'bar'] 379 379 ) … … 425 425 'foobars', 426 426 Column('id', Integer, primary_key=True), 427 Column('foobar', String ))427 Column('foobar', String(64))) 428 428 return d 429 429 projects/sAsync/trunk/sasync/test/test_orm.py
r5 r129 29 29 30 30 import sqlalchemy as SA 31 from sqlalchemy.orm import mapper, relation 31 32 32 33 from sasync.database import AccessBroker, transact … … 78 79 def startup(self): 79 80 def gotTables(null): 80 r elation = SA.relation(SA.mapper(81 Address, self.addresses), cascade="all, delete-orphan")82 properties = {'addresses':relation}83 SA.mapper(User, self.users, properties)84 81 r = relation( 82 Address, backref='user', cascade="all, delete, delete-orphan") 83 mapper(User, self.users, properties={'addresses':r}) 84 mapper(Address, self.addresses) 85 85 86 d = self.table( 86 87 'users', … … 126 127 @transact 127 128 def getResidents(self, state): 128 users = self.session.query(User). select_by(state=state)129 users = self.session.query(User).join('addresses').filter_by(state=state) 129 130 return [x.user_name for x in users] 130 131 131 132 @transact 132 133 def getTarzan(self): 133 return self.session.query(User). get_by(user_name='tarzan')134 return self.session.query(User).filter_by(user_name='tarzan').one() 134 135 135 136 @transact 136 137 def getJane(self): 137 return self.session.query(User). get_by(user_name='jane')138 return self.session.query(User).filter_by(user_name='jane').one() 138 139 139 140 @transact … … 155 156 return d 156 157 157 def test SimpleJoinQuery(self):158 def test_query_bothStates(self): 158 159 d = self.broker.setJane(session=True) 159 160 d = self.broker.setTarzan(session=True) 160 161 d.addCallback(lambda _: self.broker.getResidents('UT', session=True)) 161 162 d.addCallback(self.failUnlessEqual, ['jane', 'tarzan']) 163 return d 164 165 def test_query_oneState(self): 166 d = self.broker.setJane(session=True) 167 d = self.broker.setTarzan(session=True) 168 d.addCallback(lambda _: self.broker.getResidents('OK', session=True)) 169 d.addCallback(self.failUnlessEqual, ['jane']) 162 170 return d 163 171 … … 173 181 @defer.deferredGenerator 174 182 def testDeleteUser(self): 175 yield defer.waitForDeferred(self.broker.setJane(session=True)) 176 yield defer.waitForDeferred(self.broker.setTarzan(session=True)) 177 183 # Setup Tarzan & Jane 184 wfd = defer.waitForDeferred(self.broker.setJane(session=True)) 185 yield wfd; wfd.getResult() 186 wfd = defer.waitForDeferred(self.broker.setTarzan(session=True)) 187 yield wfd; wfd.getResult() 188 # Delete Jane 178 189 wfd = defer.waitForDeferred(self.broker.getJane(session=True)) 179 190 yield wfd 180 191 user = wfd.getResult() 181 yield defer.waitForDeferred( 182 self.broker.deleteUser(user, session=True)) 183 184 wfd = defer.waitForDeferred( 185 self.broker.getResidents('UT', session=True)) 192 wfd = defer.waitForDeferred(self.broker.deleteUser(user, session=True)) 193 yield wfd; wfd.getResult() 194 # Make sure only Tarzan is listed for a Utah address 195 wfd = defer.waitForDeferred(self.broker.getResidents('UT', session=True)) 186 196 yield wfd 187 197 self.failUnlessEqual(wfd.getResult(), ['tarzan']) projects/sAsync/trunk/setup.py
r68 r129 38 38 39 39 ### Define setup options 40 kw = {'version':'0. 6',40 kw = {'version':'0.7', 41 41 'license':'GPL', 42 42 'platforms':'OS Independent',
