1
from sqlalchemy.testing import eq_, assert_raises
2
from sqlalchemy.ext import declarative as decl
3
from sqlalchemy import testing
4
from sqlalchemy import MetaData, Integer, String, ForeignKey
5
from sqlalchemy.testing.schema import Table, Column
6
from sqlalchemy.orm import relationship, create_session, \
9
from sqlalchemy.testing import fixtures
11
class DeclarativeReflectionBase(fixtures.TablesTest):
12
__requires__ = 'reflectable_autoincrement',
16
Base = decl.declarative_base(testing.db)
19
super(DeclarativeReflectionBase, self).teardown()
22
class DeclarativeReflectionTest(DeclarativeReflectionBase):
25
def define_tables(cls, metadata):
26
Table('users', metadata,
28
primary_key=True, test_needs_autoincrement=True),
29
Column('name', String(50)), test_needs_fk=True)
33
Column('id', Integer, primary_key=True,
34
test_needs_autoincrement=True),
35
Column('email', String(50)),
36
Column('user_id', Integer, ForeignKey('users.id')),
42
Column('id', Integer, primary_key=True,
43
test_needs_autoincrement=True),
44
Column('user_id', Integer),
45
Column('network', String(50)),
46
Column('handle', String(50)),
51
meta = MetaData(testing.db)
53
class User(Base, fixtures.ComparableEntity):
55
__tablename__ = 'users'
57
if testing.against('oracle', 'firebird'):
58
id = Column('id', Integer, primary_key=True,
59
test_needs_autoincrement=True)
60
addresses = relationship('Address', backref='user')
62
class Address(Base, fixtures.ComparableEntity):
64
__tablename__ = 'addresses'
66
if testing.against('oracle', 'firebird'):
67
id = Column('id', Integer, primary_key=True,
68
test_needs_autoincrement=True)
70
u1 = User(name='u1', addresses=[Address(email='one'),
71
Address(email='two')])
72
sess = create_session()
76
eq_(sess.query(User).all(), [User(name='u1',
77
addresses=[Address(email='one'), Address(email='two')])])
78
a1 = sess.query(Address).filter(Address.email == 'two').one()
79
eq_(a1, Address(email='two'))
80
eq_(a1.user, User(name='u1'))
83
meta = MetaData(testing.db)
85
class User(Base, fixtures.ComparableEntity):
87
__tablename__ = 'users'
89
if testing.against('oracle', 'firebird'):
90
id = Column('id', Integer, primary_key=True,
91
test_needs_autoincrement=True)
92
nom = Column('name', String(50), key='nom')
93
addresses = relationship('Address', backref='user')
95
class Address(Base, fixtures.ComparableEntity):
97
__tablename__ = 'addresses'
99
if testing.against('oracle', 'firebird'):
100
id = Column('id', Integer, primary_key=True,
101
test_needs_autoincrement=True)
103
u1 = User(nom='u1', addresses=[Address(email='one'),
104
Address(email='two')])
105
sess = create_session()
109
eq_(sess.query(User).all(), [User(nom='u1',
110
addresses=[Address(email='one'), Address(email='two')])])
111
a1 = sess.query(Address).filter(Address.email == 'two').one()
112
eq_(a1, Address(email='two'))
113
eq_(a1.user, User(nom='u1'))
114
assert_raises(TypeError, User, name='u3')
116
def test_supplied_fk(self):
117
meta = MetaData(testing.db)
119
class IMHandle(Base, fixtures.ComparableEntity):
121
__tablename__ = 'imhandles'
123
if testing.against('oracle', 'firebird'):
124
id = Column('id', Integer, primary_key=True,
125
test_needs_autoincrement=True)
126
user_id = Column('user_id', Integer, ForeignKey('users.id'))
128
class User(Base, fixtures.ComparableEntity):
130
__tablename__ = 'users'
132
if testing.against('oracle', 'firebird'):
133
id = Column('id', Integer, primary_key=True,
134
test_needs_autoincrement=True)
135
handles = relationship('IMHandle', backref='user')
137
u1 = User(name='u1', handles=[IMHandle(network='blabber',
138
handle='foo'), IMHandle(network='lol', handle='zomg'
140
sess = create_session()
144
eq_(sess.query(User).all(), [User(name='u1',
145
handles=[IMHandle(network='blabber', handle='foo'),
146
IMHandle(network='lol', handle='zomg')])])
147
a1 = sess.query(IMHandle).filter(IMHandle.handle == 'zomg'
149
eq_(a1, IMHandle(network='lol', handle='zomg'))
150
eq_(a1.user, User(name='u1'))
152
class DeferredReflectBase(DeclarativeReflectionBase):
154
super(DeferredReflectBase,self).teardown()
155
from sqlalchemy.ext.declarative.base import _MapperConfig
156
_MapperConfig.configs.clear()
160
class DeferredReflectPKFKTest(DeferredReflectBase):
162
def define_tables(cls, metadata):
164
Column('id', Integer,
165
primary_key=True, test_needs_autoincrement=True),
168
Column('id', Integer,
171
Column('x', Integer, primary_key=True)
174
def test_pk_fk(self):
175
class B(decl.DeferredReflection, fixtures.ComparableEntity,
178
a = relationship("A")
180
class A(decl.DeferredReflection, fixtures.ComparableEntity,
184
decl.DeferredReflection.prepare(testing.db)
186
class DeferredReflectionTest(DeferredReflectBase):
189
def define_tables(cls, metadata):
190
Table('users', metadata,
191
Column('id', Integer,
192
primary_key=True, test_needs_autoincrement=True),
193
Column('name', String(50)), test_needs_fk=True)
197
Column('id', Integer, primary_key=True,
198
test_needs_autoincrement=True),
199
Column('email', String(50)),
200
Column('user_id', Integer, ForeignKey('users.id')),
204
def _roundtrip(self):
206
User = Base._decl_class_registry['User']
207
Address = Base._decl_class_registry['Address']
209
u1 = User(name='u1', addresses=[Address(email='one'),
210
Address(email='two')])
211
sess = create_session()
215
eq_(sess.query(User).all(), [User(name='u1',
216
addresses=[Address(email='one'), Address(email='two')])])
217
a1 = sess.query(Address).filter(Address.email == 'two').one()
218
eq_(a1, Address(email='two'))
219
eq_(a1.user, User(name='u1'))
221
def test_basic_deferred(self):
222
class User(decl.DeferredReflection, fixtures.ComparableEntity,
224
__tablename__ = 'users'
225
addresses = relationship("Address", backref="user")
227
class Address(decl.DeferredReflection, fixtures.ComparableEntity,
229
__tablename__ = 'addresses'
231
decl.DeferredReflection.prepare(testing.db)
234
def test_abstract_base(self):
235
class DefBase(decl.DeferredReflection, Base):
238
class OtherDefBase(decl.DeferredReflection, Base):
241
class User(fixtures.ComparableEntity, DefBase):
242
__tablename__ = 'users'
243
addresses = relationship("Address", backref="user")
245
class Address(fixtures.ComparableEntity, DefBase):
246
__tablename__ = 'addresses'
248
class Fake(OtherDefBase):
249
__tablename__ = 'nonexistent'
251
DefBase.prepare(testing.db)
254
def test_redefine_fk_double(self):
255
class User(decl.DeferredReflection, fixtures.ComparableEntity,
257
__tablename__ = 'users'
258
addresses = relationship("Address", backref="user")
260
class Address(decl.DeferredReflection, fixtures.ComparableEntity,
262
__tablename__ = 'addresses'
263
user_id = Column(Integer, ForeignKey('users.id'))
265
decl.DeferredReflection.prepare(testing.db)
268
def test_mapper_args_deferred(self):
269
"""test that __mapper_args__ is not called until *after* table reflection"""
271
class User(decl.DeferredReflection, fixtures.ComparableEntity,
273
__tablename__ = 'users'
276
def __mapper_args__(cls):
278
"order_by":cls.__table__.c.name
281
decl.DeferredReflection.prepare(testing.db)
291
sess.query(User).all(),
300
class DeferredInhReflectBase(DeferredReflectBase):
301
def _roundtrip(self):
302
Foo = Base._decl_class_registry['Foo']
303
Bar = Base._decl_class_registry['Bar']
305
s = Session(testing.db)
308
Bar(data='d1', bar_data='b1'),
309
Bar(data='d2', bar_data='b2'),
310
Bar(data='d3', bar_data='b3'),
316
s.query(Foo).order_by(Foo.id).all(),
318
Bar(data='d1', bar_data='b1'),
319
Bar(data='d2', bar_data='b2'),
320
Bar(data='d3', bar_data='b3'),
325
class DeferredSingleInhReflectionTest(DeferredInhReflectBase):
328
def define_tables(cls, metadata):
329
Table("foo", metadata,
330
Column('id', Integer, primary_key=True,
331
test_needs_autoincrement=True),
332
Column('type', String(32)),
333
Column('data', String(30)),
334
Column('bar_data', String(30))
337
def test_basic(self):
338
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
340
__tablename__ = 'foo'
341
__mapper_args__ = {"polymorphic_on":"type",
342
"polymorphic_identity":"foo"}
345
__mapper_args__ = {"polymorphic_identity":"bar"}
347
decl.DeferredReflection.prepare(testing.db)
350
def test_add_subclass_column(self):
351
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
353
__tablename__ = 'foo'
354
__mapper_args__ = {"polymorphic_on":"type",
355
"polymorphic_identity":"foo"}
358
__mapper_args__ = {"polymorphic_identity":"bar"}
359
bar_data = Column(String(30))
361
decl.DeferredReflection.prepare(testing.db)
364
def test_add_pk_column(self):
365
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
367
__tablename__ = 'foo'
368
__mapper_args__ = {"polymorphic_on":"type",
369
"polymorphic_identity":"foo"}
370
id = Column(Integer, primary_key=True)
373
__mapper_args__ = {"polymorphic_identity":"bar"}
375
decl.DeferredReflection.prepare(testing.db)
378
class DeferredJoinedInhReflectionTest(DeferredInhReflectBase):
380
def define_tables(cls, metadata):
381
Table("foo", metadata,
382
Column('id', Integer, primary_key=True,
383
test_needs_autoincrement=True),
384
Column('type', String(32)),
385
Column('data', String(30)),
388
Table('bar', metadata,
389
Column('id', Integer, ForeignKey('foo.id'), primary_key=True),
390
Column('bar_data', String(30)),
394
def test_basic(self):
395
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
397
__tablename__ = 'foo'
398
__mapper_args__ = {"polymorphic_on":"type",
399
"polymorphic_identity":"foo"}
402
__tablename__ = 'bar'
403
__mapper_args__ = {"polymorphic_identity":"bar"}
405
decl.DeferredReflection.prepare(testing.db)
408
def test_add_subclass_column(self):
409
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
411
__tablename__ = 'foo'
412
__mapper_args__ = {"polymorphic_on":"type",
413
"polymorphic_identity":"foo"}
416
__tablename__ = 'bar'
417
__mapper_args__ = {"polymorphic_identity":"bar"}
418
bar_data = Column(String(30))
420
decl.DeferredReflection.prepare(testing.db)
423
def test_add_pk_column(self):
424
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
426
__tablename__ = 'foo'
427
__mapper_args__ = {"polymorphic_on":"type",
428
"polymorphic_identity":"foo"}
429
id = Column(Integer, primary_key=True)
432
__tablename__ = 'bar'
433
__mapper_args__ = {"polymorphic_identity":"bar"}
435
decl.DeferredReflection.prepare(testing.db)
438
def test_add_fk_pk_column(self):
439
class Foo(decl.DeferredReflection, fixtures.ComparableEntity,
441
__tablename__ = 'foo'
442
__mapper_args__ = {"polymorphic_on":"type",
443
"polymorphic_identity":"foo"}
446
__tablename__ = 'bar'
447
__mapper_args__ = {"polymorphic_identity":"bar"}
448
id = Column(Integer, ForeignKey('foo.id'), primary_key=True)
450
decl.DeferredReflection.prepare(testing.db)