asyncpg 获取反馈 (python)
asyncpg fetch feedback (python)
我一直在使用 psycopg2 来管理我的 PostgreSQL 数据库中的项目。最近有人建议我可以通过在我的代码中使用 asyncio 和 asyncpg 来改进我的数据库事务。我查看了 Stack Overflow 并通读了示例文档。我已经能够创建 tables 并插入记录,但我一直无法获得我想要的执行反馈。
例如,在我的 psycopg2 代码中,我可以在插入记录之前验证 table 是否存在。
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())
您将 fetchone()[0]
用于 psycopg2,但仅 fetch(...)
用于 asyncpg。前者将检索第一行的第一列,而后者将检索整个行列表。作为一个列表,它不等于 True
.
要从单行中获取单个值,请使用 answer = await conn.fetchval(...)
。
我一直在使用 psycopg2 来管理我的 PostgreSQL 数据库中的项目。最近有人建议我可以通过在我的代码中使用 asyncio 和 asyncpg 来改进我的数据库事务。我查看了 Stack Overflow 并通读了示例文档。我已经能够创建 tables 并插入记录,但我一直无法获得我想要的执行反馈。
例如,在我的 psycopg2 代码中,我可以在插入记录之前验证 table 是否存在。
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())
您将 fetchone()[0]
用于 psycopg2,但仅 fetch(...)
用于 asyncpg。前者将检索第一行的第一列,而后者将检索整个行列表。作为一个列表,它不等于 True
.
要从单行中获取单个值,请使用 answer = await conn.fetchval(...)
。