加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Psycopg2 – AttributeError:’NoneType’对象没有属

发布时间:2020-12-20 11:45:42 所属栏目:Python 来源:网络整理
导读:我有一个 Python脚本来列出使用psycopg2的PostgreSQL模式. #!/usr/bin/env pythonimport yamlimport psycopg2def load_config(file_name): with open(file_name,'r') as stream: config = yaml.load(stream) return configconfig = load_config('config.yml'
我有一个 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?我的剧本有什么问题吗?

解决方法

.execute()只执行查询而不返回任何内容.取决于你如何获取结果(例如:iterator,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()永远不会返回结果集.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读