Я ссылаюсь на поддержку 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' для поддержки многопользовательского режима.(также решение в указанном выше вопросе.)