asyncpg получить отзыв (python) - PullRequest
0 голосов
/ 05 ноября 2018

Я использую psycopg2 для управления элементами в моей базе данных PostgreSQL. Недавно кто-то предложил мне улучшить транзакции с моей базой данных, используя asyncio и asyncpg в моем коде. Я осмотрел Stack Overflow и прочитал документацию для примеров. Мне удалось создать таблицы и вставить записи, но я не смог получить отзывы об исполнении, которые мне нужны.

Например, в моем коде psycopg2 я могу проверить, что таблица существует или не существует до вставки записей.

def table_exists(self, verify_table_existence, name):
    '''Verifies the existence of a table within the PostgreSQL database'''
    try:
        self.cursor.execute(verify_table_existence, name)

        answer = self.cursor.fetchone()[0]

        if answer == True:
            print('The table - {} - exists'.format(name))
            return True
        else:
            print ('The table - {} - does NOT exist'.format(name))
            return False

    except Exception as error:

        logger.info('An error has occurred while trying to verify the existence of the table {}'.format(name))
        logger.info('Error message: {}').format(error)
        sys.exit(1)

Я не смог получить такой же отзыв, используя asyncpg. Как мне это сделать?

import asyncpg
import asyncio

async def main():
conn = await asyncpg.connect('postgresql://postgres:mypassword@localhost:5432/mydatabase')

answer = await conn.fetch('''
SELECT EXISTS (
SELECT 1
FROM   pg_tables
WHERE  schemaname = 'public'
AND    tablename = 'test01'
); ''')

await conn.close()

#####################
# the fetch returns
# [<Record exists=True>]
# but prints 'The table does NOT exist'
#####################

if answer == True:
    print('The table exists')   
else:
    print('The table does NOT exist')


asyncio.get_event_loop().run_until_complete(main())

1 Ответ

0 голосов
/ 06 ноября 2018

Вы использовали fetchone()[0] с psycopg2, но просто fetch(...) с asyncpg. Первый извлечет первый столбец первой строки, а второй - весь список строк. Будучи списком, он не сравнивается как равный True.

Чтобы извлечь одно значение из одной строки, используйте что-то вроде answer = await conn.fetchval(...).

...