我有一个现有的数据库,它有两个模式,名为schools
和{
class DirectorioEstablecimiento(Base):
__table_args__ = {'schema': 'schools'}
__tablename__ = 'addresses'
# some Columns are defined here
以及
^{pr2}$我可以使用Base
实例作为Base.metadata.create_all(bind=engine)
在postgres中的测试数据库中重新创建它。如果我查询pg_namespace
,我可以确认这没有问题
In [111]: engine.execute("SELECT * FROM pg_namespace").fetchall()
2017-12-13 18:04:01,006 INFO sqlalchemy.engine.base.Engine SELECT * FROM pg_namespace
2017-12-13 18:04:01,006 INFO sqlalchemy.engine.base.Engine {}
Out[111]:
[('pg_toast', 10, None),
('pg_temp_1', 10, None),
('pg_toast_temp_1', 10, None),
('pg_catalog', 10, '{postgres=UC/postgres,=U/postgres}'),
('public', 10, '{postgres=UC/postgres,=UC/postgres}'),
('information_schema', 10, '{postgres=UC/postgres,=U/postgres}'),
('schools', 16386, None),
('students', 16386, None)]
从psqlcli
user# select * from pg_tables;
schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity
--------------------+------------------------------+------------+------------+------------+----------+-------------+-------------
schools | addresses | diego | | t | f | f | f
students | enrollments | diego | | t | f | f | f
pg_catalog | pg_statistic | postgres | | t | f | f | f
pg_catalog | pg_type | postgres | | t | f | f | f
pg_catalog | pg_authid | postgres | pg_global | t | f | f | f
pg_catalog | pg_user_mapping | postgres | | t | f | f | f
-- other tables were omitted
但是,如果我想在declarative_base
的其他实例中反映该数据库,则不会反映任何内容。在
有点像
In [87]: Base.metadata.tables.keys()
Out[87]: dict_keys(['schools.addresses', 'students.enrollments'])
In [88]: new_base = declarative_base()
In [89]: new_base.metadata.reflect(bind=engine)
In [90]: new_base.metadata.tables.keys()
Out[90]: dict_keys([])
我知道reflect
接受一个schema
作为参数,但我希望在反射期间一次获得所有这些参数。因为某些原因,我可以一次完成这个任务。在
有办法吗?在
当您调用
metadata.reflect()
时,它将只反映默认架构(您对其拥有权限的search_path
中的第一个)。因此,如果您的搜索路径是public,students,school
,它将只反映模式public
中的表。如果您对schema public没有权限,public
模式将被跳过,并将默认仅反映students
。在默认模式由
SELECT current_schema();
检索以反映其他模式 您需要为每个模式调用
metadata.reflect()
。在用模式作为表名前缀的示例 在
^{pr2}$**作为奖励,这里有一个小片段,它将在每个模式中公开动态子模块中的所有表,以便您可以访问它**
创建一个文件,即数据库并放置以下内容
使用automap base和要注册模式的模块的
__dict__
调用此函数。在或者
然后你会得到
相关问题 更多 >
编程相关推荐