无法通过设置search_path

时间:2019-03-15 12:09:34

标签: postgresql sqlalchemy

我指的是SQLAlchemy support of Postgres Schemas以支持我的多租户服务。

基本上,它是将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()”无效。

我错过了什么吗?谢谢!

P.S。我知道使用__table_args__ = {'schema': 'cust1'}可以让sqlalchemy在'cust1'模式中创建表,但是我想使用'search_path'支持多租户。 (也是上述参考问题中的解决方案。)

0 个答案:

没有答案