【问题标题】:Executing queries in console script在控制台脚本中执行查询
【发布时间】:2018-06-23 22:44:31
【问题描述】:

我正在努力弄清楚为什么我在金字塔的引导之后得到的会话拒绝执行查询,从而引发了 transaction.interfaces.NoTransaction 异常。

我正在尝试使用金字塔配置创建脚本,但正在处理后台任务。我正在使用bootstrap 函数来获得环境。我尝试的一种方法是:

from pyramid.plaster import bootstrap

with bootstrap(sys.argv[1]) as env
    dbsession = env['request'].dbsession

    with dbsession.begin_nested():
        res = dbsession.execute('''SELECT ....''')
        ...

这会按预期创建SessionTransaction,但仍会引发NoTransaction

如何初始化连接,以便像往常一样在视图中访问它?

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案1】:

    https://github.com/Pylons/pyramid/issues/3219 中所述,默认情况下事务未初始化。可以使用:

    with bootstrap(sys.argv[1]) as env:
        with env['request'].tm:
            dbsession = env['request'].dbsession
            dbsession.execute(...)
    

    【讨论】:

      【解决方案2】:

      我从未使用过pyramid.plaster.bootstrap。但是,您可以使用与使用 alchemy 模板创建新项目时自动生成的脚本相同的模板。

      pcreate -t alchemy myproject
      

      脚本如下所示:

      import os
      import sys
      import transaction
      
      from pyramid.paster import (
          get_appsettings,
          setup_logging,
          )
      
      from pyramid.scripts.common import parse_vars
      
      from ..models.meta import Base
      from ..models import (
          get_engine,
          get_session_factory,
          get_tm_session,
          )
      from ..models import MyModel
      
      
      def usage(argv):
          cmd = os.path.basename(argv[0])
          print('usage: %s <config_uri> [var=value]\n'
                '(example: "%s development.ini")' % (cmd, cmd))
          sys.exit(1)
      
      
      def main(argv=sys.argv):
          if len(argv) < 2:
              usage(argv)
          config_uri = argv[1]
          options = parse_vars(argv[2:])
          setup_logging(config_uri)
          settings = get_appsettings(config_uri, options=options)
      
          engine = get_engine(settings)
          Base.metadata.create_all(engine)
      
          session_factory = get_session_factory(engine)
      
          with transaction.manager:
              dbsession = get_tm_session(session_factory, transaction.manager)
      
              model = MyModel(name='one', value=1)
              dbsession.add(model)
      

      setup.py 中的入口点如下所示:

      entry_points="""\
        [paste.app_factory]
        main = myproject:main
        [console_scripts]
        initialize_myproject_db = myproject.scripts.initializedb:main
        """,
      

      【讨论】:

      • 我发现了那个脚本,但对样板代码感觉不太好。如有必要,我最终会使用它,但如果可能的话,我想使用更简单的引导程序。
      猜你喜欢
      • 2011-03-10
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      相关资源
      最近更新 更多