Hi, i have a very bad issue on SA using Oracle database link.
I have 2 Oracle (11g) database instances, one used for my app, in other 
stored some data, which i need to use.
I've created a dblink:

CREATE DATABASE LINK <link_name> CONNECT TO <SID> IDENTIFIED BY <password> 
USING 'localhost:1521/ORCL'

And synonym for table that i need:

CREATE SYNONYM swells FOR <table_name>@<link_name>

There is a restriction: i can only read data from this table, i can't 
affect another application by doing something wrong.
So, i trying to reflect on this table:

from sqlalchemy import *

engine = create_engine('oracle://<user>:<password>@<ip>:1521/<instance>', 
encoding = "windows-1251", echo='debug')

meta = MetaData(bind=engine)

t = Table("swells", meta,
    Column('col1', String, key='col1'),
    Column('col2', String, key='col2'),
    Column('col3', String, key='col3'),
    Column('col_pk', Integer, Sequence(u"col_pk_seq"), primary_key=True, 
key='id'),
    oracle_resolve_synonyms=True,
    autoload=True,
    autoload_with=engine
)
And i'm getting this error:

sqlalchemy.exc.DatabaseError: (DatabaseError) ORA-00942: таблица или 
представление пользователя не существует
'SELECT column_name, data_type, char_length, data_precision, data_scale, 
nullable, data_default FROM ALL_TAB_COLUMNSSELENA_WELLS WHERE table_name = 
:table_name AND owner = :owner ORDER BY column_id' {'owner': 
"<owner_name>", 'table_name': "<table_name>"}

I'm little cofused... The first of all, the owner of this table is 
different from my user (this obvious), and ALL_TAB_COLUMNSSELENA_WELLS 
should be ALL_TAB_COLUMN@SSELENA_WELLS (cause this is the way to load 
linked objects in Oracle).

I've searched in source of SA, found this in dialects/oracle/base.py (from 
line 631 in get_columns):

@reflection.cache    def get_columns(self, connection, table_name, schema=None, 
**kw):        """        kw arguments can be:            
oracle_resolve_synonyms            dblink        """        resolve_synonyms = 
kw.get('oracle_resolve_synonyms', False)        dblink = kw.get('dblink', '')   
     info_cache = kw.get('info_cache')        (table_name, schema, dblink, 
synonym) = \            self._prepare_reflection_args(connection, table_name, 
schema,                                          resolve_synonyms, dblink,      
                                    info_cache=info_cache)        columns = []  
      c = connection.execute(sql.text(                "SELECT column_name, 
data_type, data_length, data_precision, data_scale, "                "nullable, 
data_default FROM ALL_TAB_COLUMNS%(dblink)s "                "WHERE table_name 
= :table_name AND owner = :owner" % {'dblink': dblink}),                        
       table_name=table_name, owner=schema)


The first, nobody used the reflection on dblink before? If this is a bug, 
what should i do? I can change the _prepare_reflection_args function in 
base.py, adding the "@" to dblink and remove owner, but is this a right way?
So, i'm stuck... And sorry for my bad english...

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sqlalchemy/-/qcYnSCxzsk0J.
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