asyncpg.exceptions.PostgresSyntaxError: syntax error at or near "=" Что делать?
Я написал бота в Telegram.
Основа: Aiogram
База данных: postgreSQL + административная панель Django
Проблема: в первый раз, когда пользователи нажимают /start, чтобы использовать бота (который добавляет информацию о пользователе в базу данных), бот работает нормально, но после этого, когда пользователь, добавленный в базу данных, нажимает /start второй раз при использовании бота, возникает следующая ошибка.
postgresql.py
from typing import Union
import asyncpg
from asyncpg import Connection
from asyncpg.pool import Pool
from data import config
class Database:
def __init__(self):
self.pool: Union[Pool, None] = None
async def create(self):
self.pool = await asyncpg.create_pool(
user=config.DB_USER,
password=config.DB_PASS,
host=config.DB_HOST,
database=config.DB_NAME
)
async def execute(self, command, *args,
fetch: bool = False,
fetchval: bool = False,
fetchrow: bool = False,
execute: bool = False
):
async with self.pool.acquire() as connection:
connection: Connection
async with connection.transaction():
if fetch:
result = await connection.fetch(command, *args)
elif fetchval:
result = await connection.fetchval(command, *args)
elif fetchrow:
result = await connection.fetchrow(command, *args)
elif execute:
result = await connection.execute(command, *args)
return result
@staticmethod
def format_args(sql, parameters: dict):
sql += " AND ".join([
f"{item} = ${num}" for num, item in enumerate(parameters.keys(),
start=1)
])
return sql, tuple(parameters.values())
async def add_user(self, full_name, username, telegram_id):
sql = "INSERT INTO usersinfo_user (full_name, username, telegram_id) VALUES($1, $2, $3) returning *"
return await self.execute(sql, full_name, username, telegram_id, fetchrow=True)
async def select_all_users(self):
sql = "SELECT * FROM usersinfo_user"
return await self.execute(sql, fetch=True)
async def select_user(self, **kwargs):
sql = "SELECT * FROM usersinfo_user WHERE"
sql, parameters = self.format_args(sql, parameters=kwargs)
return await self.execute(sql, *parameters, fetchrow=True)
async def count_users(self):
sql = "SELECT COUNT(*) FROM usersinfo_user"
return await self.execute(sql, fetchval=True)
async def update_user_username(self, username, telegram_id):
sql = "UPDATE usersinfo_user SET username=$1 WHERE telegram_id=$2"
return await self.execute(sql, username, telegram_id, execute=True)
async def delete_users(self):
await self.execute("DELETE FROM usersinfo_user WHERE TRUE", execute=True)
async def drop_users(self):
await self.execute("DROP TABLE usersinfo_user", execute=True)
start.py
import logging
import asyncpg.exceptions
from aiogram import types
from aiogram.dispatcher.filters.builtin import CommandStart
from data.config import ADMINS
from keyboards.inline.languageKeyboard import choose_language
from states.intro import IntroState
from loader import dp, db, bot
@dp.message_handler(CommandStart(), state=None)
async def bot_start(message: types.Message):
try:
user = await db.add_user(telegram_id=message.from_user.id,
full_name=message.from_user.full_name,
username=message.from_user.username)
except asyncpg.exceptions.UniqueViolationError:
user = await db.select_user(telegram_id=message.from_user.id)
await message.answer("Choose language:", reply_markup=choose_language)
await IntroState.language.set()
logging.info(message)
# Notify admin about added usr
count = await db.count_users()
msg = f"User<b>{user[1]}</b> added.\n All users:<b>{count}</b> ."
await bot.send_message(chat_id=ADMINS[0], text=msg)
app.py
from aiogram import executor
from loader import dp, db
import middlewares, filters, handlers
from utils.notify_admins import on_startup_notify
from utils.set_bot_commands import set_default_commands
async def on_startup(dispatcher):
await db.create()
# Commands
await set_default_commands(dispatcher)
# Notify admin
await on_startup_notify(dispatcher)
if __name__ == '__main__':
executor.start_polling(dp, on_startup=on_startup)