【问题标题】:Psycopg2 - AttributeError: 'NoneType' object has no attribute 'fetchall'Psycopg2 - AttributeError:“NoneType”对象没有属性“fetchall”
【发布时间】:2015-10-02 06:34:12
【问题描述】:

我有一个 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 客户端执行查询时,它返回了一些行。为什么cursor.execute 返回None?我的脚本有问题吗?

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    .execute() 只执行查询,不返回任何内容。如何获取结果由您决定(例如:迭代器、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 声明没有为.execute() 方法定义返回值,因此数据库连接器可能返回与None 不同的内容。 (例如:一个布尔标志,指示 sql 命令是否已成功执行)

    但是,可以肯定的是,cursor.execute() 永远不会返回结果集。

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2012-11-04
      • 2019-01-01
      • 2021-12-26
      • 2019-07-23
      • 2018-05-13
      • 2020-09-07
      • 2017-05-03
      • 2023-03-16
      相关资源
      最近更新 更多