Psycopg2 - AttributeError: 'NoneType' object has no attribute 'fetchall'
Psycopg2 - AttributeError: 'NoneType' object has no attribute 'fetchall'
我有一个 Python 脚本来使用 psycopg2 列出 PostgreSQL 模式。
#!/usr/bin/env python
import yaml
import psycopg2
def load_config(file_name):
with open(file_name, 'r') as stream:
config = yaml.load(stream)
return config
config = load_config('config.yml')['database']
conn = psycopg2.connect(host=config['host'], port=config['port'], dbname=config['name'], user=config['user'], password=config['password'])
cursor = conn.cursor()
print('conn = %s' % conn)
print('cursor = %s' % cursor)
sql_list_schemas = """
SELECT *
FROM information_schema.schemata
WHERE schema_name <> 'information_schema'
AND schema_name !~ E'^pg_';
"""
list_schemas = cursor.execute(sql_list_schemas)
print('list_schemas = %s' % list_schemas)
print('list_schemas.fetchall() = %s' % list_schemas.fetchall())
当我 运行 脚本时,我得到:
conn = <connection object at 0x7f0e12eef050; dsn: 'user=test password=xxxxxxxxxxxxx host=127.0.0.1 port=5432 dbname=test', closed: 0>
cursor = <cursor object at 0x7f0e1326c148; closed: 0>
list_schemas = None
Traceback (most recent call last):
File "./postgres_db_schema.py", line 26, in <module>
print('list_schemas.fetchall() = %s' % list_schemas.fetchall())
AttributeError: 'NoneType' object has no attribute 'fetchall'
我认为 SQL 查询没问题。当我使用另一个 PostgreSQL 客户端执行查询时,它 returned 了一些行。为什么cursor.execute
returnNone
?我的脚本有问题吗?
.execute()
只执行查询而不 return 任何东西。如何获取结果取决于您 (例如:迭代器、fetchall()、fetchone() 等)
>>> cursor.execute(sql_list_schemas)
>>> list_schemas = cursor.fetchall()
--
同样,
>>> cursor.execute(sql_list_schemas)
>>> first_row = cursor.fetchone()
>>> second_row = cursor.fetchone()
>>> remaining_rows = cursor.fetchall()
--
PEP-2049
声明 return 值未为 .execute()
方法定义,因此数据库连接器可能 return 与 None
不同。 (例如:一个布尔标志,指示 sql 命令是否已成功执行)
但是,可以肯定的是,cursor.execute()
永远不会 return 结果集。
我有一个 Python 脚本来使用 psycopg2 列出 PostgreSQL 模式。
#!/usr/bin/env python
import yaml
import psycopg2
def load_config(file_name):
with open(file_name, 'r') as stream:
config = yaml.load(stream)
return config
config = load_config('config.yml')['database']
conn = psycopg2.connect(host=config['host'], port=config['port'], dbname=config['name'], user=config['user'], password=config['password'])
cursor = conn.cursor()
print('conn = %s' % conn)
print('cursor = %s' % cursor)
sql_list_schemas = """
SELECT *
FROM information_schema.schemata
WHERE schema_name <> 'information_schema'
AND schema_name !~ E'^pg_';
"""
list_schemas = cursor.execute(sql_list_schemas)
print('list_schemas = %s' % list_schemas)
print('list_schemas.fetchall() = %s' % list_schemas.fetchall())
当我 运行 脚本时,我得到:
conn = <connection object at 0x7f0e12eef050; dsn: 'user=test password=xxxxxxxxxxxxx host=127.0.0.1 port=5432 dbname=test', closed: 0>
cursor = <cursor object at 0x7f0e1326c148; closed: 0>
list_schemas = None
Traceback (most recent call last):
File "./postgres_db_schema.py", line 26, in <module>
print('list_schemas.fetchall() = %s' % list_schemas.fetchall())
AttributeError: 'NoneType' object has no attribute 'fetchall'
我认为 SQL 查询没问题。当我使用另一个 PostgreSQL 客户端执行查询时,它 returned 了一些行。为什么cursor.execute
returnNone
?我的脚本有问题吗?
.execute()
只执行查询而不 return 任何东西。如何获取结果取决于您 (例如:迭代器、fetchall()、fetchone() 等)
>>> cursor.execute(sql_list_schemas)
>>> list_schemas = cursor.fetchall()
--
同样,
>>> cursor.execute(sql_list_schemas)
>>> first_row = cursor.fetchone()
>>> second_row = cursor.fetchone()
>>> remaining_rows = cursor.fetchall()
--
PEP-2049
声明 return 值未为 .execute()
方法定义,因此数据库连接器可能 return 与 None
不同。 (例如:一个布尔标志,指示 sql 命令是否已成功执行)
但是,可以肯定的是,cursor.execute()
永远不会 return 结果集。