【发布时间】:2021-02-05 17:25:35
【问题描述】:
我正在将 Pyramid/SQLAlchemy 遗留代码从一个在 Python 2.7 下运行良好的应用程序更新到 Python 3.8,并在本地运行它。所有必要的要求都安装了 pip 并且 setup.py 运行没有错误。
在使用我的本地 .ini 文件运行 initialise 时,一切顺利,数据库表 (MariaDB) 都已写入。
在models.py中
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
relationship,
backref,
synonym,
)
from zope.sqlalchemy import ZopeTransactionEvents
#[...]
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionEvents()))
在主应用程序中,在获得最终输入并尝试将其添加到DBSession.add(user) 的数据库后,它在此函数处以'ZopeTransactionEvents' object has no attribute 'after_commit' 失败:
def do_create_admin_user(self):
from ..models import User
from getpass import getpass
print("Create an administrative user")
fullname = input("full name: ")
username = input("username: ")
if not username:
self.log.info("missing username - aborted")
return
if len(username) > 50:
self.log.info("username too long - aborted")
return
password = getpass("password for {}: ".format(username))
with transaction.manager:
user = User(
username=username,
fullname=fullname,
administrator=True,
password=password
)
DBSession.add(user)
self.log.info("{} created".format(username))
以下是堆栈跟踪的两个关键部分:
Traceback (most recent call last):
"[...]sqlalchemy/util/_collections.py", line 1055, in __call__
return self.registry.value
AttributeError: '_thread._local' object has no attribute 'value'
During handling of the above exception, another exception occurred:
[省略部分]
"[...]sqlalchemy/orm/deprecated_interfaces.py", line 367, in _adapt_listener
ls_meth = getattr(listener, meth)
AttributeError: 'ZopeTransactionEvents' object has no attribute 'after_commit'
这个特定问题停止了该过程,尽管进行了数天的研究(以及一些非生产性的黑客攻击),但我并没有更接近解决方案。这是一个遗留项目,我以前对 Pyramid 或 SQAlchemy 并不熟悉,所以在我进行的过程中找到自己的方式。
已修复
最后,这就是有效的方法,即 sessionmaker() 没有参数
from zope.sqlalchemy import register
# ...
DBSession = scoped_session(sessionmaker())
register(DBSession)
现在进入下一个错误。
【问题讨论】:
-
什么是
transaction.manager?它是在某处进口的吗? -
这是 Pyramid/SQLalchemy 方式的一部分:docs.pylonsproject.org/projects/pyramid/en/latest/…
-
在查看 SQLAlchemy 或 Pyramid 之前,我会检查您自己的代码。自编写代码以来,事务管理器中的实现或接口可能发生了变化。请粘贴您如何定义
DBSession。向下滚动一点后,当前的约定在this step of a Pyramid tutorial 中演示。 -
添加到上面的问题中
-
那么介意将我的答案标记为正确吗?
标签: python python-3.x sqlalchemy pyramid pylons