没有选择架构以在..错误中创建



我在亚马逊服务器上托管的Linux服务器上工作,我已经完全设置了服务器。我要做的最后一件事是主持我在烧瓶框架中创建的旧项目之一。

我正在尝试运行设置运行项目所需的数据库的Python文件。

我正在使用服务器内部运行项目的虚拟机,每次运行命令时,我都会收到以下错误:

(venv) grader@ip-10-20-6-95:/var/www/catalog/catalog$ python setup_database.py
Traceback (most recent call last):
  File "setup_database.py", line 63, in <module>
    Base.metadata.create_all(engine)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/schema.py", line 2848, in create_all
    tables=tables)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1479, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1122, in _run_visitor
    **kwargs).traverse_single(element)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 122, in traverse_single
    return meth(obj, **kw)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/ddl.py", line 70, in visit_metadata
    self.traverse_single(table, create_ok=True)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 122, in traverse_single
    return meth(obj, **kw)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/ddl.py", line 89, in visit_table
    self.connection.execute(schema.CreateTable(table))
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 662, in execute
    params)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 720, in _execute_ddl
    compiled
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 874, in _execute_context
    context)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception
    exc_info
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/util/compat.py", line 196, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 867, in _execute_context
    context)
  File "/var/www/catalog/venv/local/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 324, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.ProgrammingError: (ProgrammingError) no schema has been selected to create in
 'nCREATE TABLE users (ntid SERIAL NOT NULL, ntusername VARCHAR(100), ntemail VARCHAR(225) NOT NULL, ntprofile_pic VARCHAR(225) NOT NULL, ntPRIMARY KEY (id)n)nn' {}

我不确定为什么会遇到此错误。
我运行的命令设置了PostgreSQL(如果那样重要):

$ sudo apt-get install libpq-dev python-dev
$ sudo apt-get install postgresql postgresql-contrib
$ sudo su - postgres
$ psql
# CREATE USER catalog WITH PASSWORD 'sillypassword';
# ALTER USER catalog CREATEDB;
# CREATE DATABASE catalog WITH OWNER catalog;
# c catalog
# REVOKE ALL ON SCHEMA public FROM public;
# GRANT ALL ON SCHEMA public TO catalog;
# q
$ exit

我如何解决此问题?

no schema has been selected to create in

当您的search_path设置没有有效的首次输入时,您会遇到此错误。您的搜索路径是空的,或者第一个条目是无效的(在重命名或删除现有模式之后?),或者当前角色缺乏使用该模式的必要特权。Postgres不知道要在哪个架构中创建表。

修复您的search_path设置,或将必要的特权授予该角色,或架构qualify对象名称(例如:public.users)。但请在任何情况下修复您的search_path。请参阅:

  • search_path如何影响标识符分辨率和"当前模式"

由于 Postgres 15 ,架构public的默认特权是此错误消息的常见原因。引用发行说明:

  • 删除PUBLIC public架构(Noah Misch)的创建权限

新的默认值是安全的模式使用模式之一自安全发布以来,第5.9.6节已建议CVE-2018-1058。此更改适用于新的数据库群集和现有群集中新创建的数据库。升级集群或还原数据库转储将保留public的现有权限。

对于现有数据库,尤其是拥有多个用户的数据库,考虑撤销CREATE公共模式的许可以采用这个新的默认值。对于不需要防御的新数据库内幕威胁,授予CREATE许可将产生行为先前的版本。

简单快速的修复是授予CREATE作为所讨论的角色 - 同时登录正确的数据库,作为拥有架构的角色(默认情况下,DB所有者)或超级用户。
如果丢失了,您还需要授予USAGE,但是默认情况下仍然授予USAGE

GRANT CREATE ON SCHEMA public TO my_role;
-- GRANT CREATE, USAGE ON SCHEMA public TO my_role;  -- ?

其他一些选项包括:

  • 打开门策略,如果没有任何安全考虑。(通常在多用户环境中不建议!)

    GRANT ALL ON SCHEMA public TO my_role;
    
  • 使角色成员在拥有角色中。这也是一种非常自由的方法。my_role继承(几乎)owning_role的所有特权:

    GRANT owning_role TO my_role;
    
  • CREATE授予PUBLIC。另一个自由选择。这是重新建立Postgres 14或以上的默认值:

    GRANT CREATE ON SCHEMA public TO PUBLIC;
    

,或者您可以成为模式或超级用户的角色所有者,...
或者,也许您真的想以不同的角色操作,或者在原始角色具有特权的不同架构中创建对象。

已经回答了此问题:https://dba.stackexchange.com/a/a/275116/114247

修复程序是:

grant usage on schema public to public;
grant create on schema public to public;

我找到了pg_dump(在Postgres 10.7下)创建的文件

SELECT pg_catalog.set_config('search_path', '', false);

附近的顶部。因此,当导入文件时,它操纵了搜索路径,该路径一直持续到当前会话中。

评论该行(并开始新的会话)解决了问题。

您没有创建模式。使用CREATE SCHEMA public;创建模式然后,您可以执行grant usage on schema public to public;grant create on schema public to public

我被卡在同一问题上,并且在进行了大量研究之后,我得到了以下解决方案,假设您使用烧瓶模型使用sqlalchemy创建数据库:

创建模型时,请在定义模型列之前使用以下命令:

__table_args__ = {"schema":"schema_name"}

希望这对您有帮助。

相关内容

  • 没有找到相关文章

最新更新