Sorry for the trouble, after much stepping through source I figured it
out.
`secondary` needs to be a Table object, not a SqlSoup Entity. This
fixes it:
db.Products.relate('categories', db.Categories,
secondary=db.ProductCategory._table, #### _table is your friend!
primaryjoin=db.Products.c.ManProdCode ==
db.ProductCategory.c.ManProdCode,
secondaryjoin=db.ProductCategory.c.Category1 ==
db.Categories.c.CatCode,
foreign_keys=[db.ProductCategory.c.ManProdCode,
db.ProductCategory.c.Category1])
Cheers,
Scott
On Mar 6, 2:49 pm, Scott Torborg <[email protected]> wrote:
> I am using SqlSoup to read from an MS SQL database and I'm having some
> issues building a many-to-many relation on the mapping. The database
> doesn't have any foreign keys, so I'm manually specifying the join
> conditions and keys.
>
> Specifying the relation returns without exceptions, but as soon as I
> query the primary object, even with something as simple as .first(),
> SQLAlchemy tries to insert a row into the association table. This
> seems like incorrect behavior.
>
> db = SqlSoup(url)
>
> # A Product has many Categories, via the ProductCategory association
> table.
> db.Products.relate('categories', db.Categories,
> secondary=db.ProductCategory,
> primaryjoin=db.Products.c.ManProdCode ==
> db.ProductCategory.c.ManProdCode,
> secondaryjoin=db.ProductCategory.c.Category1 ==
> db.Categories.c.CatCode,
> foreign_keys=[db.ProductCategory.c.ManProdCode,
> db.ProductCategory.c.Category1])
>
> db.Products.first() # Fails!
>
> I am using SQLAlchemy 0.5.2 with pymssql 0.8.0 connecting through
> FreeTDS 1.12 to MS SQL Server 9.0.2047. I also checked it with the svn
> trunk (r5823) and the behavior is the same.
>
> The association table is nothing special, basically:
> (
> ManProdCode CHAR(5) NOT NULL,
> Category1 CHAR(2),
> Category2 CHAR(2)
> )
>
> The user I'm connecting with does not have INSERT privileges, so a
> DatabaseError is raised when db.Products.first() is called and SA
> tries to do the INSERT. Any idea why SA is trying to do this?
>
> Thanks!
> Scott
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "sqlalchemy/orm/query.py", line 1219, in first
> ret = list(self[0:1])
> File "sqlalchemy/orm/query.py", line 1140, in __getitem__
> return list(res)
> File "sqlalchemy/orm/query.py", line 1279, in __iter__
> self.session._autoflush()
> File "sqlalchemy/orm/session.py", line 902, in _autoflush
> self.flush()
> File "sqlalchemy/orm/session.py", line 1347, in flush
> self._flush(objects)
> File "sqlalchemy/orm/session.py", line 1417, in _flush
> flush_context.execute()
> File "sqlalchemy/orm/unitofwork.py", line 244, in execute
> UOWExecutor().execute(self, tasks)
> File "sqlalchemy/orm/unitofwork.py", line 707, in execute
> self.execute_save_steps(trans, task)
> File "sqlalchemy/orm/unitofwork.py", line 722, in execute_save_steps
> self.save_objects(trans, task)
> File "sqlalchemy/orm/unitofwork.py", line 713, in save_objects
> task.mapper._save_obj(task.polymorphic_tosave_objects, trans)
> File "sqlalchemy/orm/mapper.py", line 1352, in _save_obj
> c = connection.execute(statement.values(value_params), params)
> File "sqlalchemy/engine/base.py", line 824, in execute
> return Connection.executors[c](self, object, multiparams, params)
> File "sqlalchemy/engine/base.py", line 874, in
> _execute_clauseelement
> return self.__execute_context(context)
> File "sqlalchemy/engine/base.py", line 896, in __execute_context
> self._cursor_execute(context.cursor, context.statement,
> context.parameters[0], context=context)
> File "sqlalchemy/engine/base.py", line 950, in _cursor_execute
> self._handle_dbapi_exception(e, statement, parameters, cursor,
> context)
> File "sqlalchemy/engine/base.py", line 931, in
> _handle_dbapi_exception
> raise exc.DBAPIError.instance(statement, parameters, e,
> connection_invalidated=is_disconnect)
> sqlalchemy.exc.DatabaseError: (DatabaseError) internal error: SQL
> Server message 229, severity 14, state 5, line 1:
> INSERT permission denied on object 'ProductCategory', database
> 'SomeDB', schema 'dbo'.
> DB-Lib error message 229, severity 14:
> General SQL Server error: Check messages from the SQL Server
> 'INSERT INTO [ProductCategory] ([Category1], [Category2]) VALUES (%
> (Category1)s, %(Category2)s)' {'Category1': None, 'Category2': None}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---