📜  PostgreSQL – 用Python连接到 PostgreSQL 数据库服务器

📅  最后修改于: 2022-05-13 01:55:04.102000             🧑  作者: Mango

PostgreSQL – 用Python连接到 PostgreSQL 数据库服务器

psycopg数据库适配器用于通过Python与 PostgreSQL 数据库服务器连接。

安装 psycopg:

首先,从终端使用以下命令行:

pip install psycopg

如果你已经将源码包下载到你的电脑中,你可以使用 setup.py 如下:

python setup.py build
sudo python setup.py install

创建一个新数据库

首先,使用任何客户端工具(例如 pgAdmin 或 psql)登录 PostgreSQL 数据库服务器。

其次,使用以下语句在 PostgreSQL 数据库服务器中创建一个名为 providers 的新数据库。

CREATE DATABASE suppliers;

使用 psycopg2 连接到 PostgreSQL 数据库

要连接到供应商数据库,请使用 psycopg2 模块的 connect()函数。

connect()函数创建一个新的数据库会话并返回连接类的一个新实例。通过使用连接对象,您可以创建一个新游标来执行任何 SQL 语句。

要调用 connect()函数,请将 PostgreSQL 数据库参数指定为连接字符串,并将其传递给函数,如下所示:

conn = psycopg2.connect("dbname=suppliers user=postgres password=postgres")

或者您可以使用关键字参数列表:

conn = psycopg2.connect(
    host="localhost",
    database="suppliers",
    user="postgres",
    password="Abcd1234")

以下是连接参数列表:

数据库:要连接的数据库的名称。

user:用于认证的用户名。

密码:用于认证的密码。

主机:数据库服务器地址,例如本地主机或 IP 地址。

port:如果不提供,默认为 5432 的端口号。

为了更方便,您可以使用配置文件来存储所有连接参数。

下面显示了 database.ini 文件的内容:

[postgresql]
host=localhost
database=suppliers
user=postgres
password=SecurePas$1

通过使用 database.ini,您可以在将代码移动到生产环境时更改 PostgreSQL 连接参数,而无需修改代码。

请注意,如果您使用 git,则需要将 database.ini 添加到 .gitignore 文件中,以免将敏感信息提交到 github 等公共 repo。 .gitignore 文件将如下所示:

database.ini

以下 config()函数读取 database.ini 文件并返回连接参数。 config()函数放在 config.py 文件中:

#!/usr/bin/python
from configparser import ConfigParser


def config(filename='database.ini', section='postgresql'):
    # create a parser
    parser = ConfigParser()
    # read config file
    parser.read(filename)

    # get section, default to postgresql
    db = {}
    if parser.has_section(section):
        params = parser.items(section)
        for param in params:
            db[param[0]] = param[1]
    else:
        raise Exception('Section {0} not found in the {1} file'.format(section, filename))

    return db

下面的 connect()函数连接到供应商数据库并打印出 PostgreSQL 数据库版本。

#!/usr/bin/python
import psycopg2
from config import config

def connect():
    """ Connect to the PostgreSQL database server """
    conn = None
    try:
        # read connection parameters
        params = config()

        # connect to the PostgreSQL server
        print('Connecting to the PostgreSQL database...')
        conn = psycopg2.connect(**params)
        
        # create a cursor
        cur = conn.cursor()
        
    # execute a statement
        print('PostgreSQL database version:')
        cur.execute('SELECT version()')

        # display the PostgreSQL database server version
        db_version = cur.fetchone()
        print(db_version)
       
    # close the communication with the PostgreSQL
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()
            print('Database connection closed.')


if __name__ == '__main__':
    connect()

这个怎么运作。

首先,从 database.ini 文件中读取数据库连接参数。

接下来,通过调用 connect()函数创建一个新的数据库连接。

然后,创建一个新的游标并执行一条 SQL 语句来获取 PostgreSQL 数据库版本。

之后,通过调用游标对象的 fetchone() 方法读取结果集。

最后,通过调用游标和连接对象的close()方法关闭与数据库服务器的通信。

执行connect.py文件

要执行 connect.py 文件,请使用以下命令:

python connect.py

您将看到以下输出:

Connecting to the PostgreSQL database...
PostgreSQL database version:
('PostgreSQL 12.3, compiled by Visual C++ build 1914, 64-bit', )
Database connection closed.

故障排除

如果发生错误,connect()函数会引发 DatabaseError 异常。要查看它是如何工作的,您可以更改 database.ini 文件中的连接参数。

例如,如果您将主机更改为 localhosts,程序将输出以下消息:

Connecting to the PostgreSQL database...
could not translate host name "localhosts" to address: Unknown host

当您将数据库更改为不存在的数据库(例如供应商)时,以下显示错误消息:

Connecting to the PostgreSQL database...
FATAL: database "supplier" does not exist

如果把用户改成postgress,就不会认证成功,如下:

Connecting to the PostgreSQL database...
FATAL: password authentication failed for user "postgress"