python - 在 sqlalchemy 中管理用户权限

标签 python postgresql sqlalchemy privileges sql-grant

我有一个 sqlalchemy 脚本,它创建并使用代表许多用户连接的许多引擎实例。所有引擎都配置为指向同一个 postgres 数据库。

我有一个引擎 oSuperEngine 可以做 super 的事情。我有 Bob 的另一个引擎“oBobsEngine”。

现在我正在做这样的事情:

sSQL = "GRANT ALL PRIVILEGES ON TABLE \"NICE_TABLE\" to bob;"
oSuperEngine.execute(sSQL)

sSQL = "insert into \"NICE_TABLE\" (foo) values (bar)"
oBobsEngine.execute(sSQL) # ERROR HERE

并获得:

ProgrammingError: (ProgrammingError) permission denied for relation NICE_TABLE

这是为什么?

在 psql \dp 中告诉我 bob 从未被授予权限。如果我使用 super 用户登录 psql 并手动授予 bob 他的权限,那么一切正常。在这种情况下,我使用与通过 sqlalchemy 执行的命令完全相同的命令。

有什么地方没有正确冲洗吗? sqlalchemy 是否出于某种原因喜欢在尝试授予语句时静默失败?我怎样才能使它工作?

很抱歉没有包含更多代码,代码库有点复杂。事件的顺序已使用日志向我确认...如果您需要更多代码以理解我的问题,请告诉我。

一些日志

2014-03-10 10:07:24,767 - common.sqlalchemy_tools - DEBUG - connection string = "postgresql+psycopg2://super:password@localhost/db_name"
2014-03-10 10:07:24,767 - sqlalchemy.engine.base.Engine - INFO - BEGIN;
2014-03-10 10:07:24,767 - sqlalchemy.engine.base.Engine - INFO - {}
2014-03-10 10:07:24,767 - sqlalchemy.engine.base.Engine - INFO - GRANT ALL PRIVILEGES ON TABLE "MY_TABLE" to bob;
2014-03-10 10:07:24,767 - sqlalchemy.engine.base.Engine - INFO - {}
2014-03-10 10:07:24,768 - sqlalchemy.engine.base.Engine - INFO - COMMIT;
2014-03-10 10:07:24,768 - sqlalchemy.engine.base.Engine - INFO - {}
 ...
2014-03-10 10:07:24,804 - common.sqlalchemy_tools - DEBUG - connection string = "postgresql+psycopg2://bob:password@localhost/db_name"
2014-03-10 10:07:24,814 - sqlalchemy.engine.base.Engine - INFO - BEGIN;
2014-03-10 10:07:24,815 - sqlalchemy.engine.base.Engine - INFO - {}
2014-03-10 10:07:24,827 - sqlalchemy.engine.base.Engine - INFO - insert into "MY_TABLE" (stuff) values (other stuff);
2014-03-10 10:07:24,827 - sqlalchemy.engine.base.Engine - INFO - {}
2014-03-10 10:07:24,828 - sqlalchemy.engine.base.Engine - INFO - ROLLBACK

第一堆发生在 oSuperEngine 上,第二堆发生在 bob 的引擎上。错误看起来像:

ProgrammingError: (ProgrammingError) permission denied for relation MY_TABLE
 'insert into "MY_TABLE" (stuff) values (stuff);' {}

最佳答案

我遇到了完全相同的问题。通过这样做修复:

sSQL = "GRANT ALL PRIVILEGES ON TABLE \"NICE_TABLE\" to bob;"
with oSuperEngine.begin() as conn:
    conn.execute(sSQL)

http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#adding-additional-configuration-to-an-existing-sessionmaker

关于python - 在 sqlalchemy 中管理用户权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288581/

相关文章:

python - 无法使用 SMTP 处理程序记录 Flask 异常

python - 如何获得第 3 方 cookie?

postgresql - ODBC/JDBC 代理到 Postgresql

python - 从 sqlalchemy 获取第一行

python - 来自原始 tcp 数据包的实时视频

python - 在 python 中使用 gdb 中的栅格数据集

mysql - 如何查找每个用户的首次事件日期?

java - 在 java 中使用准备好的语句插入到自定义 SQL 类型中

python - Sqlalchemy:当字符串位于左侧且列位于右侧时,使用 PSQL 的 `~` 运算符

python - 如何使用 SQLAlchemy 在插入时解析相关的外键?