数据库管理是软件工程师和数据工程师日常工作中的重要组成部分。他们经常需要使用数据库管理系统(如PostgreSQL)来处理数据库相关任务。本文将探讨如何与数据库进行交互,并使用数据库应用程序接口(DBAPI)从其他编程语言或网络服务器连接到数据库。将讨论DBAPI的基础知识以及它们如何使基于Python的数据库交互成为可能。
服务器是在网络上(如互联网)与用户交互以提供服务的中心化软件。客户端是可能向服务器请求信息的软件,类似于计算机上的网络浏览器。当访问网页时,浏览器(客户端)会联系服务器,服务器则通过返回页面数据来响应。
任何向数据库发出请求的应用程序都是数据库客户端。在某些情况下,数据库客户端可能是一个网络服务器。网络服务器作为服务器满足浏览器的请求,但当它向数据库请求数据时,它作为数据库的客户端,而数据库是服务器(因为它正在满足请求)。
在这个场景中,PostgreSQL(Postgres)数据库系统可以与多个客户端通信,充当服务器角色。客户端可能以多种形式存在,例如命令行程序或下载到计算机上的具有图形用户界面的网络应用程序,这些应用程序调用Postgres服务器并期待响应以满足用户请求。
在使用PostgreSQL之前,需要先进行安装。MacOS可能已经预装了PostgreSQL,因为它随计算机预装。以下是下载和安装PostgreSQL的指导,以防万一需要:
PostgreSQL是一个开源的、通用的、对象关系型数据库管理系统,许多人认为它是目前最先进的数据库系统。它是一个关系型数据库系统,增强了面向对象的能力,并且是跨平台的。例如,它支持数组(单个列中的多个值)和继承(表之间的父子关系)等对象关系支持。
PostgreSQL完全支持SQL标准。它是事务性的:使用原子事务执行数据库操作。它具有多版本并发控制,可以防止在数据库同时进行多个写入操作时产生不必要的锁定(避免等待数据库访问时间)。PostgreSQL允许同时从多个数据库进行读写操作。它提供了出色的性能和多种索引选项,以提高查询速度。
Postgres命令行(psql客户端)提供了一些基本操作和命令,供一般参考。打开终端,然后以特定用户身份登录到psql客户端。以下是不同操作系统的登录命令:
MacOS: $ sudo -u -i
Linux: $ sudo -u psql
Windows: psql -U
默认安装的用户称为postgres。稍后可以更改用户名和密码。
创建新数据库。安装的默认数据库称为postgres。但是,可以使用以下命令(SQL语句)创建新数据库(SQL语句)。新数据库可以使用“c”psql命令打开。
postgres=# CREATE DATABASE new_database;
postgres=# c new_database
现在已连接到数据库“new_database”作为用户“postgres”。
当使用特定应用程序(客户端)和特定编程语言时,有时可能需要与数据库(服务器)接口,查询其内容并使用其结果。DBAPI在这种情况下会很有用,例如,如果数据工程师想要使用Python创建数据管道。
DBAPIs,也称为数据库适配器,提供了一个通用接口,允许像Python这样的编程语言与关系型数据库服务器通信。数据库适配器是一个基本库,用于创建连接到数据库的SQL查询。
每个服务器框架或语言都有不同的DBAPI用于与数据库系统交互。例如,Python(Django或Flask)和Postgres使用psycopg2 DBAPI,而NodeJS框架和Postgres数据库系统使用node-postgres数据库适配器。在psycopg2的情况下,数据库适配器将SQL查询的输出(例如SELECT * FROM table_name;)转换为Python中的元组列表。
安装psycopg2并使用它在Python中建立与Postgres服务器的连接并与之交互。以下是步骤:
确保已安装Python 3(版本3.5及以上)。使用命令检查:
$ python --version
使用环境中安装的最新版本的pip(即pip3)安装psycopg2:
pip install psycopg2
以下是执行基本SQL操作的Python代码示例。
注意:使用上一节中创建的数据库(new_database)。如果可能,可以创建另一个数据库。
import psycopg2
# 与现有数据库建立连接并开始会话
connection = psycopg2.connect('dbname=new_database user= host=localhost password=')
# 为数据库事务创建会话
cur = connection.cursor()
# 在数据库中创建一个新表
cur.execute('''CREATE TABLE newtable (id INTEGER PRIMARY KEY, status BOOLEAN NOT NULL DEFAULT False);''')
# 向新表中插入记录
cur.execute('''INSERT INTO newtable (id,status) VALUES (1,True);''')
# 提交会话中的事务
connection.commit()
# 关闭与会话的连接
connection.close()
cur.close()
保存sample.py脚本,然后在终端中运行它:使用所有python(或python3)并使用以下命令指向保存的Python文件。
$ python sample.py
注意:有时可能会遇到操作错误:
$ python sample.py
Traceback (most recent call last):
File "D:Dev LearningDev ArticlesBlogathonsample.py", line 6, in
connection = psycopg2.connect('dbname=new_database ')
File "C:UsersonyanAppDataLocalProgramsPythonPython310libsite-packagespsycopg2__init__.py", line 122, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: connection to server at "localhost" (::1), port 5432 failed: fe_sendauth: no password supplied
尝试添加密码并指定用户。
psycopg2.connect("dbname=database user= host=localhost password=password")
接下来,检查数据库是否有任何由Python脚本所做的更改。像以前一样重新打开psql客户端,并使用“dt”命令查看表。
new_database=#
new_database=# dt
关系列表
模式 | 名称 | 类型 | 所有者
--------+----------+-------+----------
public | newtable | 表 | postgres
public | table1 | 表 | postgres
(2行)
连接是客户端软件与数据库服务器通信的渠道。根据客户端-服务器模型,连接是必要的,以便通过通信协议(TCP/IP)传输请求和接收响应。