1
from sqlalchemy import *
2
from sqlalchemy.util import *
3
from test import fixture
4
from migrate.changeset import *
6
class TestConstraint(fixture.DB):
7
level=fixture.DB.CONNECT
9
super(TestConstraint, self)._setup(url)
12
if hasattr(self,'table') and self.engine.has_table(self.table.name):
14
super(TestConstraint, self)._teardown()
16
def _create_table(self):
17
self._connect(self.url)
18
self.meta = MetaData(self.engine)
19
self.table = Table('mytable',self.meta,
21
Column('fkey',Integer),
24
if self.engine.has_table(self.table.name):
27
#self.assertEquals(self.table.primary_key,[])
28
self.assertEquals(len(self.table.primary_key),0)
29
self.assert_(isinstance(self.table.primary_key,
30
schema.PrimaryKeyConstraint),self.table.primary_key.__class__)
31
def _define_pk(self,*cols):
32
# Add a pk by creating a PK constraint
33
pk = PrimaryKeyConstraint(table=self.table, *cols)
34
self.assertEquals(list(pk.columns),list(cols))
35
if self.url.startswith('oracle'):
36
# Can't drop Oracle PKs without an explicit name
40
if not self.url.startswith('sqlite'):
41
self.assertEquals(list(self.table.primary_key),list(cols))
42
#self.assert_(self.table.primary_key.name is not None)
44
# Drop the PK constraint
45
if not self.url.startswith('oracle'):
46
# Apparently Oracle PK names aren't introspected
47
pk.name = self.table.primary_key.name
50
#self.assertEquals(list(self.table.primary_key),list())
51
self.assertEquals(len(self.table.primary_key),0)
52
self.assert_(isinstance(self.table.primary_key,
53
schema.PrimaryKeyConstraint),self.table.primary_key.__class__)
56
@fixture.usedb(not_supported='sqlite')
57
def test_define_fk(self):
58
"""FK constraints can be defined, created, and dropped"""
59
# FK target must be unique
60
pk = PrimaryKeyConstraint(self.table.c.id, table=self.table)
62
# Add a FK by creating a FK constraint
63
self.assertEquals(self.table.c.fkey.foreign_keys._list, [])
64
fk = ForeignKeyConstraint([self.table.c.fkey],[self.table.c.id], table=self.table)
65
self.assert_(self.table.c.fkey.foreign_keys._list is not [])
66
self.assertEquals(list(fk.columns), [self.table.c.fkey])
67
self.assertEquals([e.column for e in fk.elements],[self.table.c.id])
68
self.assertEquals(list(fk.referenced),[self.table.c.id])
70
if self.url.startswith('mysql'):
71
# MySQL FKs need an index
72
index = Index('index_name',self.table.c.fkey)
74
if self.url.startswith('oracle'):
75
# Oracle constraints need a name
78
#self.engine.echo=True
80
#self.engine.echo=False
83
self.assert_(self.table.c.fkey.foreign_keys._list is not [])
86
#self.engine.echo=True
88
#self.engine.echo=False
91
self.assertEquals(self.table.c.fkey.foreign_keys._list, [])
94
def test_define_pk(self):
95
"""PK constraints can be defined, created, and dropped"""
96
self._define_pk(self.table.c.id)
99
def test_define_pk_multi(self):
100
"""Multicolumn PK constraints can be defined, created, and dropped"""
101
#self.engine.echo=True
102
self._define_pk(self.table.c.id,self.table.c.fkey)
105
class TestAutoname(fixture.DB):
106
level=fixture.DB.CONNECT
108
def _setup(self, url):
109
super(TestAutoname, self)._setup(url)
110
self._connect(self.url)
111
self.meta = MetaData(self.engine)
112
self.table = Table('mytable',self.meta,
113
Column('id',Integer),
114
Column('fkey',String(40)),
116
if self.engine.has_table(self.table.name):
121
if hasattr(self,'table') and self.engine.has_table(self.table.name):
123
super(TestAutoname, self)._teardown()
125
@fixture.usedb(not_supported='oracle')
126
def test_autoname(self):
127
"""Constraints can guess their name if none is given"""
128
# Don't supply a name; it should create one
129
cons = PrimaryKeyConstraint(self.table.c.id)
132
if not self.url.startswith('sqlite'):
133
self.assertEquals(list(cons.columns),list(self.table.primary_key))
135
# Remove the name, drop the constraint; it should succeed
139
self.assertEquals(list(),list(self.table.primary_key))