I am using svn update from today..

I am testing with Firebird engine, which I realize may be busted. However I just took a look at the MS-SQL engine and it does the same thing.

I have a table with a compound key, like this:

Tcontact = Table('contact',
    Column('system_id',
           Integer,
           primary_key=True,
           nullable=False,
    ),
    Column('id',
           Integer,
           Sequence("contact_id", optional=True),
           primary_key=True,
           nullable=False,
    ),
    Column('first_name',
           String(16),
           nullable=False,
    ),
<snip>

class contact(object):
    pass

assign_mapper(contact, Tcontact)


I use global_connect to connect to a firebird database, and just for giggles try

contact.get(1,1)

I expect a database sql error, because there aren't any records in the contact table. Instead I get a traceback:

>>> contact.get(1,1)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\mapper.py", line 247, in get
    return self.query.get(*ident, **kwargs)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\query.py", line 43, in get
    return self._get(key, ident, **kwargs)
File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\query.py", line 205, in _get return self._select_statement(statement, params=params, populate_existing=re
load)[0]
File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\query.py", line 213, in _select
_statement
    return self.instances(statement.execute(**params), **kwargs)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 473, in execute
    return self.using(self.engine).execute(*multiparams, **params)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 378, in execute
return self.compile(*multiparams, **params).execute(*multiparams, **params)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 386, in compile
    compiler = self.engine.compiler(self.clauseelement, bindparams)
File "e:\prj\sqlalchemy\lib\sqlalchemy\ext\proxy.py", line 30, in compiler
    return self.get_engine().compiler(*args, **kwargs)
File "e:\prj\sqlalchemy\lib\sqlalchemy\databases\firebird.py", line 105, in co
mpiler
return FBCompiler(statement, bindparams, engine=self, use_ansi=self._use_ans
i, **kwargs)
TypeError: __init__() got multiple values for keyword argument 'engine'
>>>

It seems that proxy.py is passing the engine parameter, but Firebird compiler also passes it as a keyword arguement, so does the MS-SQL engine.

    def compiler(self, statement, bindparams, **kwargs):
return FBCompiler(statement, bindparams, engine=self, use_ansi=self._use_ansi, **kwargs)

Hmm, well if I print out kwargs in the compiler method, it's empty:


Ah, it seems that the positional args are out of sequence (here's a reason why I don't use positional args)

So change firebird compile() to:

    def compiler(self, statement, bindparams, **kwargs):
return FBCompiler(statement, bindparams, engine=self, use_ansi=self._use_ansi, **kwargs)

and change FBCompiler.__init__ to be like:

def __init__(self, statement, parameters, engine, use_ansi = True, **kwargs):
        self._outertable = None
        self._use_ansi = use_ansi
ansisql.ANSICompiler.__init__(self, statement, parameters, engine, **kwargs)


(though mssql has a cleaner init.. )

But still this fails and I'm afraid I'm out of time. Guess I'll move to ms-sql..

(I now get this error)

Traceback (most recent call last):
  File "<string>", line 1, in ?
File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\mapper.py", line 247, in get
    return self.query.get(*ident, **kwargs)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\query.py", line 43, in get
    return self._get(key, ident, **kwargs)
File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\query.py", line 205, in _get return self._select_statement(statement, params=params, populate_existing=re
load)[0]
File "e:\prj\sqlalchemy\lib\sqlalchemy\mapping\query.py", line 213, in _select
_statement
    return self.instances(statement.execute(**params), **kwargs)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 473, in execute
    return self.using(self.engine).execute(*multiparams, **params)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 378, in execute
return self.compile(*multiparams, **params).execute(*multiparams, **params)
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 387, in compile
    compiler.compile()
  File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 344, in compile
    self.statement.accept_visitor(self)
File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 1391, in accept_visitor
    visitor.visit_select(self)
File "e:\prj\sqlalchemy\lib\sqlalchemy\ansisql.py", line 304, in visit_select
    l.accept_visitor(self)
File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 1049, in accept_visitor
    self.obj.accept_visitor(visitor)
File "e:\prj\sqlalchemy\lib\sqlalchemy\sql.py", line 1075, in accept_visitor
    visitor.visit_column(self)
File "e:\prj\sqlalchemy\lib\sqlalchemy\databases\firebird.py", line 200, in vi
sit_column
    return ansisql.ANSICompiler.visit_column(self, column)
File "e:\prj\sqlalchemy\lib\sqlalchemy\ansisql.py", line 180, in visit_column
    self.typemap.setdefault(column.key.lower(), column.type)
AttributeError: 'FBSQLEngine' object has no attribute 'setdefault'




-------------------------------------------------------
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
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to