Проблемы с использованием библиотеки asyn c: aio mysql (python - бот) - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь преобразовать свои стандартные функции базы данных в функции aio mysql asyn c (для бота), но я не совсем понимаю, как работают функции asyn c ...

Вот мой фактический код, который я хочу преобразовать:

def connection(Database):
    conn = mysql.connector.connect(host=Database[0],
                                    user=Database[1],
                                    password=Database[2],
                                    database=Database[3])

    c = conn.cursor()

    return c, conn

def insertToTable(Database, insert, data):
    c, conn = connection(Database)
    try:
        pass
        c.execute(insert, data)
        conn.commit()
    except mysql.connector.IntegrityError as e:
    #cnx.close()

def deleteFromTable(Database, query):
    c, conn = connection(Database)
    try:
        c.execute(query)
        c.commit()
    except:
        pass

def getMax(Database, columnName, tableName):
    c, conn = connection(Database)
    c.execute("SELECT MAX(" + columnName + ") FROM " + tableName)

    result = c.fetchall()
    for i in result:
        if i[0] is None:
            return 0
        else:
            return i[0]

Мои проекты разделены на несколько файлов, я получил несколько других базовых запросов, которые я не преобразовал в функции:

c, conn = dbconnect.connection(DB)
                    c.execute("update Tar SET va= (%s) WHERE x=1",(va_num))
                    conn.commit()

и некоторые избранные fetchall / fetchone et c

Я написал это после прочтения документации и поиска некоторых (редких) примеров:

import asyncio
import aiomysql
import setup as setup

loop = asyncio.get_event_loop()

@asyncio.coroutine
def exec_sql(insert, data):
    pool = yield from aiomysql.create_pool(host=setup.DB_local[0], port=3306,
                                           user=setup.DB_local[1], password=setup.DB_local[2],
                                           db=setup.DB_local[3], loop=loop, autocommit=False)

    with (yield from pool) as conn:
        cur = yield from conn.cursor()
        yield from cur.execute(insert, data)
        yield from conn.commit()
    conn.close
    #pool.close()
    #yield from pool.wait_closed()

insert = ("INSERT into discord_rights (discord_id, discord_name, discord_role, is_admin, is_caster, is_player)""VALUES (%s, %s, %s, %s, %s, %s)")
data = (10, "lea", 0, 0, 1, 1)
sql = loop.run_until_complete(exec_sql(insert, data))

@asyncio.coroutine
def get_one_sql(sql):
    pool = yield from aiomysql.create_pool(host=setup.DB_local[0], port=3306,
                                           user=setup.DB_local[1], password=setup.DB_local[2],
                                           db=setup.DB_local[3], loop=loop, autocommit=False)

    with (yield from pool) as conn:
        cur = yield from conn.cursor()
        yield from cur.execute(sql)
        r = yield from cur.fetchone()
    conn.close
    return r
    #pool.close()
    #yield from pool.wait_closed()

sql = loop.run_until_complete(get_one_sql("SELECT * from discord_rights WHERE discord_id = 124545xxxxxxxx"))
print(sql)


Но я не уверен если это хороший способ, потому что я создаю новый пул для каждого запроса, верно? Может кто-нибудь помочь мне построить функцию (импортировать пул, созданный в другой части кода) или что-то лучше, если я все еще не прав?

Спасибо за вашу помощь и извините за длинное сообщение, Я предпочел показать вам мои коды, а не ничего!

...