此处的问题是sqlalchemy如何决定在每个语句之后发出提交。
如果将文本传递给
engine.execute,则sqlalchemy将尝试使用以下正则表达式确定该文本是DML还是DDL。您可以在这里的资源中找到它
AUTOCOMMIT_REGEXP = re.compile( r"s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)", re.I | re.UNICODE)
仅当单词在文本开头时才检测这些单词,而忽略任何前导空格。因此,在您第一次尝试时
# worksfine,第二个示例无法识别出执行语句后需要发出提交,因为第一个单词是
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)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)