Files
sqlalchemy/test/reflection.py
T
Mike Bayer ecb5b87c19 refactor to engine to have a separate SQLSession object. allows nested transactions.
util.ThreadLocal __hasattr__ method/raise_error param meaningless, removed
renamed old engines test to reflection
2006-03-17 02:15:09 +00:00

172 lines
5.8 KiB
Python

import sqlalchemy.ansisql as ansisql
import sqlalchemy.databases.postgres as postgres
import sqlalchemy.databases.oracle as oracle
import sqlalchemy.databases.sqlite as sqllite
from sqlalchemy import *
from testbase import PersistTest
import testbase
import unittest, re
class ReflectionTest(PersistTest):
def testbasic(self):
# really trip it up with a circular reference
use_function_defaults = testbase.db.engine.__module__.endswith('postgres') or testbase.db.engine.__module__.endswith('oracle')
use_string_defaults = use_function_defaults or testbase.db.engine.__module__.endswith('sqlite')
if use_function_defaults:
defval = func.current_date()
deftype = Date
else:
defval = "3"
deftype = Integer
if use_string_defaults:
deftype2 = String
defval2 = "im a default"
else:
deftype2 = Integer
defval2 = "15"
users = Table('engine_users', testbase.db,
Column('user_id', INT, primary_key = True),
Column('user_name', VARCHAR(20), nullable = False),
Column('test1', CHAR(5), nullable = False),
Column('test2', FLOAT(5), nullable = False),
Column('test3', TEXT),
Column('test4', DECIMAL, nullable = False),
Column('test5', TIMESTAMP),
Column('parent_user_id', Integer, ForeignKey('engine_users.user_id')),
Column('test6', DateTime, nullable = False),
Column('test7', String),
Column('test8', Binary),
Column('test_passivedefault', deftype, PassiveDefault(defval)),
Column('test_passivedefault2', Integer, PassiveDefault("5")),
Column('test_passivedefault3', deftype2, PassiveDefault(defval2)),
Column('test9', Binary(100)),
mysql_engine='InnoDB'
)
addresses = Table('engine_email_addresses', testbase.db,
Column('address_id', Integer, primary_key = True),
Column('remote_user_id', Integer, ForeignKey(users.c.user_id)),
Column('email_address', String(20)),
mysql_engine='InnoDB'
)
# users.c.parent_user_id.set_foreign_key(ForeignKey(users.c.user_id))
users.create()
addresses.create()
# clear out table registry
users.deregister()
addresses.deregister()
try:
users = Table('engine_users', testbase.db, autoload = True)
addresses = Table('engine_email_addresses', testbase.db, autoload = True)
finally:
addresses.drop()
users.drop()
users.create()
addresses.create()
try:
# create a join from the two tables, this insures that
# theres a foreign key set up
# previously, we couldnt get foreign keys out of mysql. seems like
# we can now as long as we use InnoDB
# if testbase.db.engine.__module__.endswith('mysql'):
# addresses.c.remote_user_id.append_item(ForeignKey('engine_users.user_id'))
print users
print addresses
j = join(users, addresses)
print str(j.onclause)
self.assert_((users.c.user_id==addresses.c.remote_user_id).compare(j.onclause))
finally:
addresses.drop()
users.drop()
def testmultipk(self):
table = Table(
'engine_multi', testbase.db,
Column('multi_id', Integer, primary_key=True),
Column('multi_rev', Integer, primary_key=True),
Column('name', String(50), nullable=False),
Column('value', String(100))
)
table.create()
# clear out table registry
table.deregister()
try:
table = Table('engine_multi', testbase.db, autoload=True)
finally:
table.drop()
print repr(
[table.c['multi_id'].primary_key,
table.c['multi_rev'].primary_key
]
)
table.create()
table.insert().execute({'multi_id':1,'multi_rev':1,'name':'row1', 'value':'value1'})
table.insert().execute({'multi_id':2,'multi_rev':18,'name':'row2', 'value':'value2'})
table.insert().execute({'multi_id':3,'multi_rev':3,'name':'row3', 'value':'value3'})
table.select().execute().fetchall()
table.drop()
def testtoengine(self):
db = ansisql.engine()
table = Table('mytable', db,
Column('myid', Integer, key = 'id'),
Column('name', String, key = 'name', nullable=False),
Column('description', String, key = 'description'),
)
print repr(table)
pgdb = postgres.engine({})
pgtable = table.toengine(pgdb)
print repr(pgtable)
assert pgtable.c.id.nullable
assert not pgtable.c.name.nullable
assert pgtable.c.description.nullable
def testoverride(self):
table = Table(
'override_test', testbase.db,
Column('col1', Integer, primary_key=True),
Column('col2', String(20)),
Column('col3', Numeric)
)
table.create()
# clear out table registry
table.deregister()
try:
table = Table(
'override_test', testbase.db,
Column('col2', Unicode()),
Column('col4', String(30)), autoload=True)
print repr(table)
self.assert_(isinstance(table.c.col1.type, Integer))
self.assert_(isinstance(table.c.col2.type, Unicode))
self.assert_(isinstance(table.c.col4.type, String))
finally:
table.drop()
if __name__ == "__main__":
testbase.main()