Использование данных пользователя из aiogram для фильтрации в бд postgresql
Идея состоит в том, чтобы собирать пользователей бота в одну базу данных. Бот может получать user_id, full_name и т.д.
Проблема в последней функции new_user и хендлере. Не понимаю как передать из aiogram значения в sql запрос для внесения в бд. Так же при выполнении кода ниже выходит ошибка:
await DBComm.new_user() TypeError: new_user() missing 2 required positional arguments: 'self' and 'conn'
class DBComm:
async def run(self):
conn = await asyncpg.connect(database="members", user="postgres", password="1234", host="127.0.0.1",
port="5432")
return conn
async def select(self, conn):
values = await conn.fetchrow('SELECT * FROM users')
a = dict(values)
data = [f"{k}-{v}" for k, v in values.items()]
# print(data)
text = "\n".join(data)
# print(text)
return text
async def new_user(self, conn, use=True):
user = types.User.get_current()
user_id = user.id
full_name = user.full_name
args = (user_id, use, full_name)
await conn.execute('INSERT INTO users (user_id, use, full_name) VALUES ($1, $2, $3) RETURNING id', args)
@dp.message_handler(commands="s", state="*")
async def user(message: types.message):
user_id = message.from_user.id
full_name = message.from_user.full_name
await DBComm.new_user()
await message.answer('test')
Ответы (2 шт):
не приходилось работать с aiogram, но могу предоставить пример с pytelegrambotapi:
def create_db_users(id_tlgrm, phone_tlgrm):
conn = psycopg2.connect(dbname=db_name, user=db_user, password=db_password, host=db_host)
cursor = conn.cursor()
cursor.execute("INSERT INTO users VALUES (%s, %s);", (id_tlgrm, phone_tlgrm))
conn.commit()
@bot.message_handler(content_types=['contact'])
def contact_phone(message):
create_db_users(message.chat.id, message.contact.phone_number)
А указанная ошибка
await DBComm.new_user() TypeError: new_user() missing 2 required positional arguments: 'self' and 'conn'
говорит о том, что вы не передали self и conn в функцию в месте, где вы её вызываете.
Ошибка в том, что Вы не вызвали метод DBComm().run(), перед тем как создавать нового пользователя.
@dp.message_handler(commands="s", state="*")
async def user(message: types.message):
user_id = message.from_user.id
full_name = message.from_user.full_name
conn = await DBComm().run()
await DBComm().new_user(conn=conn)
await message.answer('test')