this was something reasonably stupid (the bug in the code, not the test case !) and is fixed in 1663 .On Jun 26, 2006, at 2:27 PM, Tim Van Steenburgh wrote: Test script and stack trace below:
import sqlalchemy.mods.threadlocal from sqlalchemy import *
sqlite = 'sqlite:///:memory:'
db = create_engine(sqlite, strategy='plain', echo=True )
metadata = BoundMetaData(db)
################################################################################ # TABLE DEFS ################################################################################
users = Table('user', metadata, Column('id', Integer, primary_key=True), Column('first_name', String(64)), Column('last_name', String(64)), Column('email', String(128)), Column('password', String(16)), Column('is_active', Boolean) )
roles = Table('role', metadata, Column('id', Integer, primary_key=True), Column('description', String(32)) )
user_roles = Table('user_role', metadata, Column('user_id', Integer, ForeignKey('user.id'), primary_key=True), Column('role_id', Integer, ForeignKey('role.id'), primary_key=True) )
admins = Table('admin', metadata, Column('id', Integer, primary_key=True), Column('user_id', Integer, ForeignKey('user.id')) )
################################################################################ # CLASS DEFS ################################################################################ class User(object): def __init__(self, fname=None, lname=None, email=None, is_active=1): self.first_name = fname self.last_name = lname self.email = email self.is_active = is_active def has_role(self, role_name): if role_name in [role.description for role in self.roles]: return True else: return False class Role(object): def __init__(self, description=None): self.description = description class UserRole(object): pass
class Admin(User): def __init__(self, fname=None, lname=None, email=None, is_active=1): User.__init__(self, fname, lname, email, is_active) # give user 'admin' role self.roles.append(Query(Role).get_by(description='admin')) ################################################################################ # MAPPER DEFS ################################################################################
role_mapper = mapper(Role, roles)
user_mapper = mapper(User, users, properties = { 'roles' : relation(Role, secondary=user_roles, lazy=False, private=False) } )
admin_mapper = mapper(Admin, admins, inherits=user_mapper)
################################################################################ # MAIN ################################################################################
if __name__ == "__main__": # create tables users.create() roles.create() user_roles.create() admins.create()
# create roles adminrole = Role('admin') clientrole = Role('client') adjusterrole = Role('adjuster')
objectstore.flush() # create admin user a = Admin('Tim', 'Van Steenburgh', '[EMAIL PROTECTED]' ) a.password = 'admin' objectstore.flush()
# edit admin admin = Query(Admin).get_by(first_name='Tim') admin.password = 'sadmin'
objectstore.flush()
Traceback (most recent call last): File "model_test.py", line 118, in ? objectstore.flush() File "build/bdist.linux-i686/egg/sqlalchemy/orm/session.py", line 233, in flush File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 228, in flush File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 399, in execute File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 672, in execute File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 637, in _execute_childtasks File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 672, in execute File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 637, in _execute_childtasks File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 670, in execute File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 629, in _execute_dependencies File "build/bdist.linux-i686/egg/sqlalchemy/orm/unitofwork.py", line 528, in execute File "build/bdist.linux-i686/egg/sqlalchemy/orm/dependency.py", line 288, in process_dependencies File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 240, in execute File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 264, in execute_clauseelement File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 280, in execute_compiled File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 276, in proxy File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 315, in _execute_raw File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 334, in _execute sqlalchemy.exceptions.SQLError: (IntegrityError) columns user_id, role_id are not unique 'INSERT INTO user_role (user_id, role_id) VALUES (?, ?)' [1, 1]
SA tries to insert a new user_role but fails b/c it already exists. Not sure why it's trying to re-insert it.
Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo _______________________________________________ Sqlalchemy-users mailing list |