Hi all,

I've playing around with SQLAlchemy for a few months, being very happy
with the results.
As my adventures are getting gradually more complex I feel I've
finally run into a problem where I am just stuck, so any help from the
SQLAlchemy community would be greatly appreciated.

In essence I am trying to combine "Vertical Partitioning" with
"Mapping a Class against Multiple Tables". In this case I want to map
a class against multiple tables that are located in different
databases.

Below is a minimal version of a script I am trying to build. In my
actual project the situation is more complex and I'm not really
working with persons and addresses (they would fit better in the same
database). This is just a toy example to illustrate my problem.

I suspect my problem lies in my "j = join(...)" statement. "join()"
probably expects tables from the same database but I have no idea how
to tie this in with vertical partitioning.

It could very well be that I'm trying to take this too far and that I
should just work with different classes all tied to their own database
and then implement the logic between the classes separately.

Any ideas?
Many thanks,

Jan.


====== dummy code:
from datetime import datetime

from sqlalchemy import *
from sqlalchemy.orm import *

# Define SQLite databases
person_engine  = create_engine('sqlite:///person_db.sqlite')
address_engine = create_engine('sqlite:///address_db.sqlite')

# Define database structure
metadata=MetaData()
person_table = Table(
    'person', metadata,
    Column('id', Integer, primary_key=True),
    Column('name', Text),
    Column('created', DateTime, default=datetime.now),
)
address_table = Table(
    'address', metadata,
    Column('id', Integer, primary_key=True),
    Column('street', Text),
    Column('number', Integer),
    Column('person_id', Integer, index=True),
    Column('created', DateTime, default=datetime.now),
)
person_table.create(bind=person_engine)
address_table.create(bind=address_engine)

# Session, 2 tables bound to different engine
Session = scoped_session(sessionmaker(binds={
        person_table:  person_engine,
        address_table: address_engine,
    }
))
session = Session()

# 1 Class should map information from 2 databases
class Person(object):
    pass

# Map Person class to 2 tables in different databases
j = join(person_table, address_table,
address_table.c.person_id==person_table.c.id)
person_mapper = Session.mapper(
    Person,
    j,
    properties = {
        'person_id': [address_table.c.person_id, person_table.c.id]
    }
)

# database is empty, so don't expect any results
result = Person.query().all()


====== resulting error:
Traceback (most recent call last):
  File "demo.py", line 26, in <module>
    person_table.create(bind=person_engine)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/
schema.py", line 386, in create
    self.metadata.create_all(bind=bind, checkfirst=checkfirst, tables=
[self])
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/
schema.py", line 1765, in create_all
    bind.create(self, checkfirst=checkfirst, tables=tables)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 1129, in create
    self._run_visitor(self.dialect.schemagenerator, entity,
connection=connection, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 1158, in _run_visitor
    visitorcallable(self.dialect, conn, **kwargs).traverse(element)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/sql/
visitors.py", line 89, in traverse
    return traverse(obj, self.__traverse_options__,
self._visitor_dict)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/sql/
visitors.py", line 200, in traverse
    return traverse_using(iterate(obj, opts), obj, visitors)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/sql/
visitors.py", line 194, in traverse_using
    meth(target)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/sql/
compiler.py", line 797, in visit_metadata
    self.traverse_single(table)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/sql/
visitors.py", line 79, in traverse_single
    return meth(obj)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/sql/
compiler.py", line 836, in visit_table
    self.execute()
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 1812, in execute
    return self.connection.execute(self.buffer.getvalue())
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 824, in execute
    return Connection.executors[c](self, object, multiparams, params)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 888, in _execute_text
    return self.__execute_context(context)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 896, in __execute_context
    self._cursor_execute(context.cursor, context.statement,
context.parameters[0], context=context)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 950, in _cursor_execute
    self._handle_dbapi_exception(e, statement, parameters, cursor,
context)
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
python2.5/site-packages/SQLAlchemy-0.5.2-py2.5.egg/sqlalchemy/engine/
base.py", line 931, in _handle_dbapi_exception
    raise exc.DBAPIError.instance(statement, parameters, e,
connection_invalidated=is_disconnect)
sqlalchemy.exc.OperationalError: (OperationalError) table person
already exists '\nCREATE TABLE person (\n\tid INTEGER NOT NULL, \n
\tname TEXT, \n\tcreated TIMESTAMP, \n\tPRIMARY KEY (id)\n)\n\n' ()

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to