Ошибка добавление записи в таблицу через библиотеку asyncpg
Есть корутина, добавляющая в таблицу teachers, в которую входит только поле user_id, запись:
async def add_new_teacher(self, user_id :int):
command = "INSERT INTO teachers(user_id) VALUES ($1) RETURNING id"
args: tuple = (user_id)
record_id = await self.pool.fetchval(command, *args)
return record_id
Когда данный код отрабатывает, он выбрасывает ошибку:
Traceback (most recent call last): File "/home/anton/dev/Bots/EnglishGitBot/dbheandler.py", line 49, in <module>
loop.run_until_complete(asyncio.gather(data_base.add_new_teacher(1))) File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
return future.result() File "/home/anton/dev/Bots/EnglishGitBot/dbheandler.py", line 27, in add_new_teacher
record_id = await self.pool.fetchval(command, *args) TypeError: fetchval() argument after * must be an iterable, not int
Почему данный код не работает?
Есть похожая функция, написанная по тому же шаблону и она работает без ошибок. Код работающей функции:
async def add_new_user(self, chat_id: int, username: str, full_name: str):
command = "INSERT INTO users(chat_id, username, full_name) VALUES ($1, $2, $3) RETURNING id"
args :tuple = (chat_id, username, full_name)
record_id = await self.pool.fetchval(command, *args)
return record_id
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
У вас классическая ошибка:
args: tuple = (user_id)
Здесь вы создали скалярную переменную args, а не кортеж.
Пример:
In [1]: user_id = 123
In [2]: args: tuple = (user_id)
In [3]: type(args)
Out[3]: int # <-------------- NOTE!!!
Для того чтобы создать кортеж, состоящий из единственного элемента, добавьте запятую после элемента:
In [5]: args: tuple = (user_id, )
# NOTE: -------------------> ^
In [6]: type(args)
Out[6]: tuple # <--------- NOTE!!!
PS запятую нужно добавлять только в том случае, когда создаем кортеж из одного элемента:
In [7]: args: tuple = (user_id, "a string")
In [8]: type(args)
Out[8]: tuple