this could be implemented as a SQLAlchemy feature, a per-table 
"oracle_dblink_name" attribute, but currently that's not available.

What happens if you just name the table like this:

class Whatever(Base):
    __tablename__ = '[email protected]'
    __table_args__ = {'quote': False}

the "quote=False" will ensure that it doesn't try to quote that name.

Another approach might be a custom compilation rule for tables.  Not sure if 
the @DBLINK needs to be mentioned everywhere in the statement or just in the 
FROM clause:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy import Table

@compiles(Table, "oracle")
def visit_table(element, compiler, **kw):
    super_ = compiler.visit_table(element, **kw)
    dblink = element.info.get('dblink')
    if super_ and dblink:
        super_ = super_ + "@%s" % dblink
    return super_

from sqlalchemy import *
m = MetaData()

t1 = Table('user', m, Column('id', Integer, primary_key=True))
t2 = Table('employee', m, Column('id', Integer, primary_key=True),
                Column('user_id', Integer),
                info={'dblink': 'MYLINK'})


s1 = select([t1, t2]).select_from(t1.join(t2, t1.c.id == t2.c.id))

from sqlalchemy.dialects import oracle
print s1.compile(dialect=oracle.dialect())

this outputs:

SELECT "user".id, employee.id, employee.user_id 
FROM "user" JOIN employee@MYLINK ON "user".id = employee.id

just some things to try, there's more ways to do this as well if that's not 
enough.




On May 2, 2014, at 12:10 PM, Rich <[email protected]> wrote:

> Hi Sqlalchemy developers,
> I am having some trouble with using sqlalchemy 0.9.x with oracle 11 (XE) 
> while using dblinks.
> 
> Looking at past discussions of using dblinks on the sqlalchemy mailing list 
> it seems as if sqlalchemy can only use them if there is a synonym to it in 
> the schema one is connecting to.
> 
> Is there a way to set the tablename to have the @dblink name appended to it 
> without having a synonym?
> 
> i.e.
> "local" schema contains table:
> 
> create table "local".account (
>    account_id number(10,0) not null enable,
>    employee_id number(10,0),
>    ...
> );
> 
> and a dblink to our other schema:
> 
> CREATE PUBLIC DATABASE LINK "REMOTE.DBLINK"
>    CONNECT TO "foo" IDENTIFIED BY "bar"
>    USING 'remote.dblink.name.in.tnsnames.ora';
> 
> While a remote schema named "remote" contains the table:
> 
> create table "remote".employee (
>    employee_id number(10,0) not null enable,
>    ....
> );
> 
> When I connect to the local schema I want to generate sql similar to:
> SELECT e.*
> FROM "remote"[email protected]  e JOIN "local".account a ON 
> a.employee_id = e.employee_id;
> 
> 
>                                                                              
> from sqlalchemy.ext.declarative import declarative_base                       
>  
> from sqlalchemy import create_engine, Column, Integer, String                 
>  
> from sqlalchemy.orm import sessionmaker, relationship                         
>  
>                                                                               
>  
> engine = create_engine('oracle://legown:[email protected]:1527/XE')      
>    
> Session = sessionmaker(bind=engine)                                           
>  
> Base = declarative_base(engine)   
> 
> 
> class Account(Base):
>     __tablename__ = 'account'
>     account_id = Column(Integer, primary_key=True)
>     employee_id = Column(Integer)
>     remote_employee = relationship( "Employee", 
> primaryjoin="Employee.employee_id == Account.employee_id, 
> foreign_keys=[employee_id])
> 
>     def __str__(self):
>         print "%s %s %s " % ( account_id, employee_id, remote_employee)
> 
> class Employee(Base):
>     __tablename__ = 'employee'
>     __table_args__ = {'schema':'remote'}
>     employee_id = Column(Integer, primary_key=True)
> 
>     def __str__(self):
>         print "Employee remote= %s " % (  employee_id)
> 
> 
> #Assume that there is an account record with Id=1 and employee_id=1 and also 
> an Employee record with employee_id of 1                                      
>                                          
> session = Session()       
> retrieved = session.query(Account).filter_by(account_id=1).first()     
> print retrieved        
> 
> # This does not work.  To make it work I can create a synonym for employee in 
> local and change the the schema of employee to local.  But I really would 
> prefer not to have to create synonyms in my local database.  Is this possible 
> to achieve with sqlalchemy at this time?  
> 
> thanks!
> -Rich       
> 
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to