Как сделать асинхронные операции MySQL с модульными запросами? - PullRequest
0 голосов
/ 26 сентября 2019

В настоящее время я работаю над немного сложным диссон-ботом для мероприятия, управляемого сообществом.
Цель состоит в том, чтобы предоставить простой веб-интерфейс, в котором кланы могут входить в систему и делать все, что им нужно (например, зарегистрироваться).для события: просмотр статистики, просмотр команд и т. д.).
Я только что выполнил функции, которые будут обновлять роли пользователей в зависимости от таблицы, которая есть в моей базе данных MySQL.
Поскольку весь бот разногласий записанв асинхронном коде я хочу остаться со схемой, которую я уже установил.
Я уже читал об асинхронном коде и знаю, что я должен использовать что-то вроде модуля aiomysql для python.
К сожалению, документы не оченьдля начинающих, и поэтому я задаю свой вопрос здесь:

Я хочу сделать что-то вроде этого:

async def queryDB(query):
  loop = asyncio.get_event_loop()
  def test_example(query):
    conn = yield from aiomysql.connect(host='127.0.0.1', port=3306,
                                       user='root', password='', db='mysql',
                                       loop=loop)

    cur = yield from conn.cursor()
    yield from cur.execute(query)
    print(cur.description)
    results = yield from cur.fetchall()
    yield from cur.close()
    conn.close()
    return results

  var = loop.run_until_complete(test_example(query))
  return var

Как вы можете видеть, я хочу, чтобы запрос был модульным и установить параметр ввызов функции.Конечно, я хочу, чтобы мои результаты были возвращены, чтобы я мог работать с ним позже.

Этот код продолжает давать сбой с кодом ошибки: RuntimeError: This event loop is already running, и я не знаю, как это исправить.Вероятно, есть проблема с тем, как я справляюсь с циклами и как я вызываю свои функции.

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 26 сентября 2019

Я бы получил пул соединений при запуске бота и подключил его к боту.Ниже приведен пример, который запускает любой запрос.

from discord.ext.commands import Bot, is_owner

bot = Bot('!')

@bot.event
async def on_ready():
    bot.pool = await aiomysql.create_pool(host='127.0.0.1', port=3306,
                                       user='root', password='', db='mysql',
                                       loop=bot.loop)

@is_owner()  # Only bot owner can run this command
@bot.command()
async def query(ctx, *, q):
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute(q)
            res = await cur.fetchall()
            await ctx.send(str(res))

bot.run("token")
...