philshem
philshem

Reputation: 25331

Inserting to schema-specific table with python's odo

I'm using python's odo to move data from a pandas dataframe to a postgresql database. The goal is that each "user" sees their own data in their schema, but with an identical data model and table/view naming schema between "users". With normal SQL I can do this:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.my_table AS select 1;

My DB URI looks like this

db_uri = 'postgresql://localhost/postgres::my_schema.my_table'

This gives me tables in the default schema named "my_schema.my_table", including the '.' in the table name, instead of tables named "my_table" in the schema "my_schema".

I've tried different combinations based on this github issue, such as:

db_uri = 'postgresql://localhost/postgres.schema::tmp')

which gives me this Traceback

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL:  database "postgres/schema" does not exist

And also this one

db_uri = 'postgresql://localhost/postgres::my_schema/my_table'

which gives me tables named "my_schema/my_table".

Here's a sample code:

import pandas as pd
from odo import odo
db_uri = 'postgresql://localhost/postgres::my_schema.my_table'
odo(pd.DataFrame([{'a': 1}, {'a': 1}]), db_uri)

Upvotes: 0

Views: 986

Answers (1)

philshem
philshem

Reputation: 25331

Hidden deep in a mailing list for blaze is a mention of the schema parameter

d = Data(resource('postgresql://localhost/db::t', schema='myschema'))

which can be used with odo with the following format:

from odo import odo, drop
drop(db_uri, schema='my_schema') # to drop table in specific schema
odo(data, db_uri, schema='my_schema')

working code

import pandas as pd
from odo import odo
db_uri = 'postgresql://localhost/postgres::my_table'
odo(pd.DataFrame([{'a': 1}, {'a': 1}]), db_uri, schema='my_schema')

Upvotes: 1

Related Questions