SAGIRI-kawaii / sagiri-bot

基于Graia Ariadne和Mirai的QQ机器人 SAGIRI-BOT
GNU Affero General Public License v3.0
696 stars 83 forks source link

[Bug Report] [MySQL] 新用户第一次调用功能时报错 #154

Closed nullqwertyuiop closed 2 years ago

nullqwertyuiop commented 2 years ago

环境信息

系统版本: Debian Buster x64 源码版本: bf0279e42768c0f942445896f83c4cd4aa6568a2 其他信息: MySQL

问题描述 用户 59*****34 首次在群聊 10*****007 中发言的内容调用了机器人,机器人未对该次请求作出回应。

日志

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1770, in _execute_context
    self.dialect.do_execute(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/aiomysql.py", line 95, in execute
    return self.await_(self._execute_async(operation, parameters))
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 62, in await_only
    return current.driver.switch(awaitable)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 115, in greenlet_spawn
    value = await result
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/aiomysql.py", line 107, in _execute_async
    result = await self._cursor.execute(operation, parameters)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/cursors.py", line 239, in execute
    await self._query(query)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/cursors.py", line 457, in _query
    await conn.query(q)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 428, in query
    await self._read_query_result(unbuffered=unbuffered)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 622, in _read_query_result
    await result.read()
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 1105, in read
    first_packet = await self.connection._read_packet()
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 593, in _read_packet
    packet.check_error()
  File "/usr/local/lib/python3.8/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/usr/local/lib/python3.8/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.IntegrityError: (1062, "Duplicate entry '10*****007-59*****34' for key 'PRIMARY'")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.8/site-packages/graia/broadcast/__init__.py", line 204, in Executor
    result = await run_always_await_safely(
  File "/usr/local/lib/python3.8/site-packages/graia/broadcast/utilles.py", line 30, in run_always_await_safely
    return await callable(*args, **kwargs)
  File "/root/sagiri-bot/modules/SignInRewardHandler.py", line 31, in sign_in_reward_handler
    if result := await SignInRewardHandler.handle(app, message, group, member):
  File "/root/sagiri-bot/SAGIRIBOT/decorators.py", line 92, in wrapper
    return await func(*args, **kwargs)
  File "/root/sagiri-bot/SAGIRIBOT/decorators.py", line 116, in wrapper
    return await func(*args, **kwargs)
  File "/root/sagiri-bot/modules/SignInRewardHandler.py", line 52, in handle
    await update_user_call_count_plus1(group, member, UserCalledCount.functions, "functions")
  File "/root/sagiri-bot/SAGIRIBOT/utils.py", line 220, in update_user_call_count_plus1
    res = await orm.insert_or_update(
  File "/root/sagiri-bot/SAGIRIBOT/ORM/AsyncORM.py", line 118, in insert_or_update
    return await self.execute(insert(table).values(**dt))
  File "/root/sagiri-bot/SAGIRIBOT/ORM/AsyncORM.py", line 48, in execute
    raise e
  File "/root/sagiri-bot/SAGIRIBOT/ORM/AsyncORM.py", line 43, in execute
    result = await session.execute(sql, **kwargs)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/ext/asyncio/session.py", line 157, in execute
    return await greenlet_spawn(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 120, in greenlet_spawn
    result = context.throw(*sys.exc_info())
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/orm/session.py", line 1677, in execute
    result = conn._execute_20(statement, params or {}, execution_options)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1582, in _execute_20
    return meth(self, args_10style, kwargs_10style, execution_options)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/sql/elements.py", line 329, in _execute_on_connection
    return connection._execute_clauseelement(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1451, in _execute_clauseelement
    ret = self._execute_context(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1813, in _execute_context
    self._handle_dbapi_exception(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1994, in _handle_dbapi_exception
    util.raise_(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 211, in raise_
    raise exception
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1770, in _execute_context
    self.dialect.do_execute(
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute
    cursor.execute(statement, parameters)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/aiomysql.py", line 95, in execute
    return self.await_(self._execute_async(operation, parameters))
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 62, in await_only
    return current.driver.switch(awaitable)
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 115, in greenlet_spawn
    value = await result
  File "/usr/local/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/aiomysql.py", line 107, in _execute_async
    result = await self._cursor.execute(operation, parameters)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/cursors.py", line 239, in execute
    await self._query(query)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/cursors.py", line 457, in _query
    await conn.query(q)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 428, in query
    await self._read_query_result(unbuffered=unbuffered)
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 622, in _read_query_result
    await result.read()
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 1105, in read
    first_packet = await self.connection._read_packet()
  File "/usr/local/lib/python3.8/site-packages/aiomysql/connection.py", line 593, in _read_packet
    packet.check_error()
  File "/usr/local/lib/python3.8/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/usr/local/lib/python3.8/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry '10*****007-59*****34' for key 'PRIMARY'")
[SQL: INSERT INTO user_called_count (group_id, member_id, setu, `real`, bizhi, at, search, song_order, chat_count, functions) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)]
[parameters: (10*****007, 59*****34, 0, 0, 0, 0, 0, 0, 0, 1)]
(Background on this error at: http://sqlalche.me/e/14/gkpj)
SAGIRI-kawaii commented 2 years ago

好像没有遇到过,现在还有这种情况吗

nullqwertyuiop commented 2 years ago

看了下好像是,有一个模块会有更新 functions 计数的操作,然后又正好是第一次发言,这个模块和 chat_recorder 同时插入了相同的主键所以引发 IntegrityError