Вставка в специфичную для схемы таблицу с odo для Python - PullRequest
0 голосов
/ 02 сентября 2018

Я использую Python odo для перемещения данных из фрейма данных pandas в базу данных postgresql. Цель состоит в том, чтобы каждый «пользователь» видел свои собственные данные в своей схеме, но с идентичной моделью данных и схемой именования таблиц / представлений между «пользователями». С нормальным SQL я могу сделать это:

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

URI моей БД выглядит так

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

Это дает мне таблицы в схеме default с именем "my_schema.my_table", включая '.' в имени таблицы вместо таблиц с именем "my_table" в схеме "my_schema".

Я пробовал разные комбинации на основе этой проблемы github , например:

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

, который дает мне этот Traceback

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

А также этот

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

, которая дает мне таблицы с именем "my_schema / my_table".

Вот пример кода:

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)

1 Ответ

0 голосов
/ 02 сентября 2018

Скрыто глубоко в списке рассылки blaze - это упоминание параметра schema

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

, который можно использовать с odo в следующем формате:

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

рабочий код

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')
...