- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 SqlAlchemy 1.4.18(异步),我相信我遇到了无法解释的竞争条件。底层数据库是Postgres
和 asyncpg
由 SqlAlchemy 内部使用。
我在 SQL Alchemy Core 中有以下插入函数。
async def create_device(
device_id: str,
device_type: DeviceType,
account_type: AccountType = AccountType.FREE,
expires_at: Optional[datetime] = None,
account_id: Optional[int] = None,
is_banned: bool = False,
last_login_at: Optional[datetime] = None,
) -> datetime:
if expires_at is None:
expires_at = datetime.utcnow().replace(second=0, microsecond=0) + timedelta(
days=7
)
async with engine.begin() as conn:
await conn.execute(
DeviceTable.insert().values(
id=device_id,
type=device_type,
expires_at=expires_at,
account_type=account_type,
account_id=account_id,
is_banned=is_banned,
last_login_at=last_login_at,
),
)
return expires_at
单元测试自行成功运行。但是,当我在测试类中运行所有测试时,此测试每次都会失败。
@pytest.mark.asyncio
@patch("service.email_service.EmailService.confirm_token")
async def test_confirm_email_already_confirmed(self, mock_token, client):
expiry_date = self.get_time_in_future()
account_id = await crud_account.create_account(
"h@h1.de", "pass1", is_confirmed=True
)
await crud_device.create_device(
"u1", DeviceType.IPHONE, account_id=account_id, expires_at=expiry_date
)
## It has already failed at this point.
mock_token.return_value = "h@h1.de"
result = await client.get("/email/confirm/t1")
assert result.status_code == 200
错误:
../app/database/crud_device.py:26: in create_device
await conn.execute(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/ext/asyncio/engine.py:405: in execute
result = await greenlet_spawn(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/util/_concurrency_py3k.py:125: in greenlet_spawn
result = context.throw(*sys.exc_info())
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py:1582: in _execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/sql/elements.py:324: in _execute_on_connection
return connection._execute_clauseelement(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py:1451: in _execute_clauseelement
ret = self._execute_context(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py:1813: in _execute_context
self._handle_dbapi_exception(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py:1994: in _handle_dbapi_exception
util.raise_(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/util/compat.py:207: in raise_
raise exception
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py:1770: in _execute_context
self.dialect.do_execute(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/engine/default.py:717: in do_execute
cursor.execute(statement, parameters)
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:449: in execute
self._adapt_connection.await_(
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/util/_concurrency_py3k.py:67: in await_only
return current.driver.switch(awaitable)
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/util/_concurrency_py3k.py:120: in greenlet_spawn
value = await result
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:424: in _prepare_and_execute
self._handle_exception(error)
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:358: in _handle_exception
self._adapt_connection._handle_exception(error)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_connection object at 0x115007340>
error = InternalServerError('cache lookup failed for type 3912040')
def _handle_exception(self, error):
if self._connection.is_closed():
self._transaction = None
self._started = False
if not isinstance(error, AsyncAdapt_asyncpg_dbapi.Error):
exception_mapping = self.dbapi._asyncpg_error_translate
for super_ in type(error).__mro__:
if super_ in exception_mapping:
translated_error = exception_mapping[super_](
"%s: %s" % (type(error), error)
)
translated_error.pgcode = (
translated_error.sqlstate
) = getattr(error, "sqlstate", None)
> raise translated_error from error
E sqlalchemy.exc.InternalError: (sqlalchemy.dialects.postgresql.asyncpg.InternalServerError) <class 'asyncpg.exceptions.InternalServerError'>: cache lookup failed for type 3912040
E [SQL: INSERT INTO main.device (id, type, created_at, last_login_at, expires_at, account_type, is_banned, account_id) VALUES (%s, %s, now(), NULL, %s, %s, %s, %s)]
E [parameters: ('u1', 'IPHONE', datetime.datetime(2021, 6, 16, 10, 24), 'FREE', False, 1)]
E (Background on this error at: http://sqlalche.me/e/14/2j85)
../../../.pyenv/versions/venv/lib/python3.9/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:652: InternalError
这是什么
translated_error
?非常感谢
最佳答案
我从 SQLAlchemy 维护者那里得到了帮助。
正如 Nadir 在另一个答案中所建议的那样,解决此问题的一种方法是禁用缓存,但这会影响性能。
解决这个问题的正确方法是从你的拆卸单元测试中使异步引擎无效。这与您在 test_base.py
中使用同步引擎的假设一致。 .
数据库.py
engine = create_async_engine(
"postgresql+asyncpg://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
)
test_base.py
from database.database import metadata, engine
engine_sync = create_engine(
"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
)
class TestBase:
async def dispose(self):
await engine.dispose()
def teardown(self):
metadata.drop_all(engine_sync)
asyncio.run(self.dispose())
关于python - SqlAlchemy 1.4 抛出 InternalServerError(缓存查找失败,类型 3912040),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68000969/
我们一直在ElasticSearch中的随机查询上随机出现以下错误。 { \"status\":500, \"displayName\":\"InternalServerError\", \"mess
部署 ARM 时,其中部署了应用服务计划、存储、具有 2 个功能的功能应用程序。我在部署 2 个函数时遇到错误: { "status": "Failed", "error": { "code"
部署 ARM 时,其中部署了应用服务计划、存储、具有 2 个功能的功能应用程序。我在部署 2 个函数时遇到错误: { "status": "Failed", "error": { "code"
我使用 Sagemaker 对时间序列执行二元分类,每个样本都是形状为 [24,11](24h,11 个特征)的 numpy 数组。我在脚本模式下使用了 tensorflow 模型,我的脚本与我用作引
将缩略图卡发送到电报 channel 会产生以下异常。这在模拟器中运行良好。 操作返回无效状态代码“InternalServerError” 这是卡的代码: var Card = new Thumbn
使用: SDK 语言:C# SDK 版本:4.1.5 环境:本地主机、Azure channel :网络聊天 问题描述 在 Bot Framework Emulator V4 中测试机器人时,它确实按
我一直在遵循本指南来克隆现有应用程序。我通过 Docker 运行 Az Powershell 模块。 这是我运行的内容: $destapp = New-AzWebApp -ResourceGroupN
管道的设置是从存储在 Azure Blob 存储中的 .csv 文件到 Azure SQL 数据库表的简单导入。当我使用门户中的“调试”按钮在“调试”中运行管道时,作业将在 8 秒内完成。当我使用立即
我一直在遵循本指南来克隆现有应用程序。我通过 Docker 运行 Az Powershell 模块。 这是我运行的内容: $destapp = New-AzWebApp -ResourceGroupN
管道的设置是从存储在 Azure Blob 存储中的 .csv 文件到 Azure SQL 数据库表的简单导入。当我使用门户中的“调试”按钮在“调试”中运行管道时,作业将在 8 秒内完成。当我使用立即
从今天开始,我遇到了 GCM“订阅主题”的以下问题。Nexus 6、Android 6.0.1、Google Play 服务 9.0.83在应用程序中使用 google-play-services:8
我目前正在从 Outlook API 迁移到 Microsoft Graph API,当我尝试像订阅 Outlook 那样订阅日历和事件的推送通知时,我得到一个错误: { "error": { "co
我的机器人突然停止运行...... 我使用 botframework luis.ai c# 创建了一个机器人。我已经部署在 azure 中。 该机器人工作得很好,但现在当我向我的机器人发送消息时,我收
我正在尝试将 GET 请求发送到以下 API 端点: https://api.mediahound.com/1.3/search/all?PARAM_STRING https://api.mediah
我在尝试通过数据工厂调用 azure 函数时收到此错误。附有错误快照。 然后我再次尝试使用相同的参数,下一个执行实例运行良好。 我只是想知道这个问题是来自 azure 服务器端还是由于我的代码。任何帮
我正在尝试在 Azure 中测试一些灾难恢复过程。 我已在测试服务器上获取了生产 Azure SQL 数据库的副本,将其删除,并尝试使用 SQL Server 下的“已删除数据库”选项来还原它。恢复已
可以找到此方法的文档 here 这是我的代码: var appServiceManager = AppServiceManager.Authenticate(credentials,
我正在尝试在 Azure 中测试一些灾难恢复过程。 我已在测试服务器上获取了生产 Azure SQL 数据库的副本,将其删除,并尝试使用 SQL Server 下的“已删除数据库”选项来还原它。恢复已
可以找到此方法的文档 here 这是我的代码: var appServiceManager = AppServiceManager.Authenticate(credentials,
我正在使用 SqlAlchemy 1.4.18(异步),我相信我遇到了无法解释的竞争条件。底层数据库是Postgres和 asyncpg由 SqlAlchemy 内部使用。 我在 SQL Alchem
我是一名优秀的程序员,十分优秀!