Не удалось создать таблицу в другой схеме postgresql с помощью sqlalchemy, установив search_path - PullRequest
0 голосов
/ 15 марта 2019

Я ссылаюсь на поддержку SQLAlchemy схем Postgres для поддержки моего мультитенантного сервиса.

По сути, это разделение таблиц арендаторов с разными схемами в одной базе данных в postgresql, например'cust1.mytable' и 'cust2.mytable'.

Ответы на поставленный выше вопрос - использовать search_path.Однако мне не удалось создать таблицу в нужной схеме с помощью search_path.

Вот код теста:

conn_string = 'postgresql://whuang@127.0.0.1/mydb'
Base = declarative_base()

class MyTbl(Base):
    __tablename__ = 'mytable'
    row_id = Column(String(60), primary_key=True)


engine = create_engine(conn_string)

Session = sessionmaker(bind=engine)
session = Session()
session.execute("set search_path='{}'".format('cust1'))

Base.metadata.create_all(engine)

trow1 = MyTbl()
trow1.row_id = 'id1'
session.add(trow1)

session.commit()
session.close()

Результат:

mydb=# \dt *.mytable
         List of relations
 Schema |  Name   | Type  | Owner
--------+---------+-------+--------
 public | mytable | table | whuang
(1 row)

Ошибка:

    sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "mytable" does not exist
LINE 1: INSERT INTO mytable (row_id) VALUES ('id1')
                    ^
 [SQL: 'INSERT INTO mytable (row_id) VALUES (%(row_id)s)'] [parameters: {'row_id': 'id1'}] (Background on this e

Кажется, он пытался вставить строку в таблицу 'cust1.mytable', однако таблица была создана в 'public.mytable'.'Search_path' не влияет на 'create_all ()'.

Я что-то пропустил?Спасибо!

PS Я знаю, что использование __table_args__ = {'schema': 'cust1'} может позволить sqlalchemy создать таблицу в схеме 'cust1', но я бы хотел использовать 'search_path' для поддержки многопользовательского режима.(также решение в указанном выше вопросе.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...