1

我正在尝试将我的标准数据库函数转换为 aiomysql 异步函数(用于机器人),但我真的不明白异步函数是如何工作的......

这是我要转换的实际代码:

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 等

在阅读了文档并找到了一些(罕见的)示例后,我写道:

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)


但我不确定这是否是一个好方法,因为我为每个请求创建一个新池,对吗?如果我仍然错了,有人可以帮助我构建该功能(导入在代码的另一部分创建的池)或更好的东西吗?

感谢您的帮助,并为长信息感到抱歉,我更愿意向您展示我的代码而不是什么都没有!

4

0 回答 0