我指的是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'支持多租户。 (也是上述参考问题中的解决方案。)