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