Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SqlAlchemy Reflection of Oracle Table Not Owned

I'm working with SQLAlchemy to run SQL queries against an Oracle database. I have read access to the database, but the user I have does not own any of the tables I'm working with.

The database updates on a regular basis, so rather than explicitly listing the MetaData, I was hoping to use reflection. I found this question, that describes an issue similar to what I'm having. However, I don't have a way to change ownership of the tables, nor modify the database in any way. I just have read access.

Is there a way to reflect Oracle tables in SQLAlchemy if I don't have ownership of those tables?

(Edit)

Example Code:

engine = create_engine('ORACLE CONNECTION STRING')

metadata = MetaData()

students = Table('students', metadata, autoload=True, autoload_with=engine)

I receive an exception of sqlalchemy.exc.NoSuchTableError: students

However, when I run the following:

results = engine.execute('SELECT * FROM students')

for r in results:
    print(r)

I receive the output that I expected from the table, which is a tuple of all the fields for each row.

So instead of trying to reflect a single table, I try to reflect all of them:

metadata.reflect(bind=engine)

print(metadata.tables)

The output is immutabledict({}).

So essentially it's nothing. All of these tables are owned by user A where as I'm logging in with a read-only of user B.

like image 492
user2004245 Avatar asked Aug 22 '14 15:08

user2004245


1 Answers

You might have better luck reflecting someone else's tables if you specify the schema (account) you're targeting:

metadata.reflect(bind=engine, schema='userA')

This way, you'll reflect all readable tables belonging to 'userA'. I'm not sure why you're able to query students using engine.execute, though.

like image 64
jkmacc Avatar answered Oct 14 '22 01:10

jkmacc