当前位置: 首页 > 面试题库 >

SQLalchemy设置角色时不提交更改

罗绪
2023-03-14
问题内容

我正在使用sqlalchemy引擎创建表,但是即使我的create语句执行没有错误,当我尝试预先设置角色时,表也不会显示在数据库中。

url = 'postgresql://{}:{}@{}:{}/{}'
url = url.format(user, password, host, port, db)

engine = sqlalchemy.create_engine(url)

# works fine
engine.execute("CREATE TABLE testpublic (id int, val text); \n\nINSERT INTO testpublic VALUES (1,'foo'), (2,'bar'), (3,'baz');")
r = engine.execute("select * from testpublic")
r.fetchall() # returns expected tuples
engine.execute("DROP TABLE testpublic;")

# appears to succeed/does NOT throw any error
engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text);")

# throws error "relation testpublic does not exist"
engine.execute("select * FROM testpublic")

对于上下文,我使用的是python 3.6,sqlalchemy版本1.2.17和postgres 11.1,并且角色“
read_write”绝对存在,并且具有在公共场所创建表的所有必要权限(我在pgadmin中运行上面的确切序列没有问题)。

有谁知道为什么会这样以及如何解决?


问题答案:

此处的问题是sqlalchemy如何决定在每个语句之后发出提交。

如果将文本传递给engine.execute,则sqlalchemy将尝试使用以下正则表达式确定该文本是DML还是DDL。您可以在这里的资源中找到它

AUTOCOMMIT_REGEXP = re.compile(
    r"\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE
)

仅当单词在文本开头时才检测这些单词,而忽略任何前导空格。因此,在您第一次尝试时# works fine,第二个示例无法识别出执行语句后需要发出提交,因为第一个单词是SET

相反,sqlalchemy发出回滚,因此它# appears to succeed/does NOT throw any error

最简单的解决方案是手动提交。

例:

engine.execute("SET ROLE read_write; CREATE table testpublic (id int, val text); COMMIT;")

或者,将sql包装在textset中autocommit=True,如文档所示

stmt = text('set role read_write; create table testpublic (id int, val text);').execution_options(autocommit=True)
e.execute(stmt)


 类似资料:
  • 您可通过点击侧边栏角色栏进入角色管理页面。 添加角色 除系统提供角色之外,您可根据企业实际情况自定义角色。点击“添加角色”进行设置:•输入角色名称(必填) •输入角色说明(选填) •勾选角色功能权限(审批、单据为默认权限,不可删除) •勾选角色管理范围(项目或部门) 修改系统角色 主管需要您在部门模块或项目模块设置部门主管或项目主管。具体请详见【通过部门、项目管理员工】

  • 当文本输入为空时,我需要将按钮设置为灰色,一旦所有字段都已填写,请将其更改为蓝色。 login.tsx 从'React'导入React,{useState};从'react native'导入{View、Text、TextInput、TouchableOpacity};从'../../../infrastructure/components/buttons/button-outline prima

  • 我正在尝试将用户的签入值插入数据库。为此,我调用函数并设置隐藏字段的值,然后尝试提交表单,但在表单提交后,隐藏字段的值被重置。 HTML代码 Javascript PHP代码 首先,它不满足这个if(isset($\u POST['checkinout']))

  • 我目前试图设置一个管理员角色,以便访问一个简单的管理页面,使用以下留档通过提供:连接角色 我已经有一段时间不停地用我的头来撞击它,但我仍然不知道如何设置角色,例如,现在我正在从数据库中提取一个管理值,并暂时将其存储在一个全局变量中,但我不知道如何将其用于连接角色,比如只允许特定用户访问我的管理页面。 如果我的文档没有帮助我确保仅当用户是管理员时才能访问网页,那么有人可以澄清或展示如何执行此操作的示

  • 我有 在我的构建中。gradle我有 但是尽管成功了-到我的数据库中,它并没有添加任何新表。我有postreSQL,其中包含我所有表所在的方案- 我的控制台输出

  • 我正在尝试使用客户端将当前服务器的bot角色设置为粉红色。打开(“准备就绪”),但每当我使用当前拥有的内容运行bot时,控制台将返回: 这是我目前使用的代码。我知道我需要在每个公会上进行for循环,但我不确定我将如何做到这一点,我可以使用for或只是a。然而,我找不到这样做的正确方法。 提前感谢任何回复和帮助我留言的人。