【问题标题】:sqlalchemy not executing Comment on schema [duplicate]sqlalchemy 未对模式执行评论 [重复]
【发布时间】:2020-05-04 14:48:45
【问题描述】:

我不确定为什么无法通过 sqlalchemy 对架构进行评论, 但在 psql 控制台上完美运行,

尝试了各种设置仍然没有成功,创建了架构但无法添加描述。

import sqlalchemy

engine = sqlalchemy.create_engine('postgresql://postgres@localhost/posgres')
engine.execute("CREATE SCHEMA IF NOT EXISTS myschema")
engine.execute("COMMENT ON SCHEMA myschema IS 'Seemly Random Description'")

用 psql 检查

postgres=# \dn+
                           List of schemas
   Name   │  Owner   │  Access privileges   │      Description       
──────────┼──────────┼──────────────────────┼────────────────────────
 myschema │ postgres │                      │ 
 public   │ postgres │ postgres=UC/postgres↵│ standard public schema
          │          │ =UC/postgres         │ 
(2 rows)

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    不完全确定原因,但是一旦您创建连接并运行COMMIT,它似乎就可以工作:

    In [8]: conn = engine.connect()                                                                                                                                                                              
    
    In [9]: conn.execute("COMMENT ON SCHEMA myschema IS 'Seemly Random Description'")                                                                                                                            
    Out[9]: <sqlalchemy.engine.result.ResultProxy at 0x7fd109991cd0>
    
    In [10]: conn.execute("COMMIT;")                                                                                                                                                                             
    Out[10]: <sqlalchemy.engine.result.ResultProxy at 0x7fd0ff3b7d10>
    
    postgres=# \dn+
                                List of schemas
       Name   |  Owner   |  Access privileges   |        Description        
    ----------+----------+----------------------+---------------------------
     myschema | postgres |                      | Seemly Random Description
     public   | postgres | postgres=UC/postgres+| standard public schema
              |          | =UC/postgres         |
    

    【讨论】:

    • 我很惊讶地发现它在没有连接的情况下也可以工作,这让我认为在 psql 控制台中没有必要提交。并且 engine.commit() 或 connection.commit() 不是有效的方法。
    • 鉴于 SQLAlchemy 版本 1.3 或更低,这似乎依赖于未记录的行为。如果没有显式启动的事务,EngineConnection 在自动提交模式下运行,例如 here。由于 DB-API 的工作方式(连接(几乎)总是在事务中),并且 SQLAlchemy 没有在自动提交模式下显式发出回滚,执行的 COMMIT 确实有效,但正确的解决方案是使用 SQLA 的事务处理: stackoverflow.com/a/59702609/2681632
    • ...使用Engine 执行COMMIT 将不起作用,因为在“无连接”执行中,连接在使用后返回到池中,在这种情况下它是 回滚。
    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 2012-03-30
    • 2015-01-15
    • 2018-04-16
    • 2011-06-27
    • 2018-10-28
    • 1970-01-01
    • 2014-11-12
    相关资源
    最近更新 更多