Python PostgreSQL操作

PostgreSQL介绍

PostgreSQL 是一个开源的关系型数据库管理系统(RDBMS),它遵循 SQL 标准,并且支持多种高级功能,如事务管理、外键、视图、触发器等。PostgreSQL 被广泛应用于各种场景,尤其适用于需要处理复杂查询和事务的应用程序。它的特点包括支持 JSON 数据类型、强大的查询优化器、并行查询等。

PostgreSQL vs MySQL

PostgreSQL 更注重标准符合性、功能丰富性和扩展性(支持复杂类型、自定义函数等),适合复杂查询和高级应用;MySQL 更侧重简单易用、读写速度快和成熟稳定,尤其擅长高并发 OLTP 场景(如 Web 应用)。

相关笔记: python-mysql | MySQL入门


安装

# 1)安装基础包
yum install postgresql-server postgresql-contrib -y

# 2)初始化PostgreSQL数据库:
sudo postgresql-setup --initdb

# 3)启动并启用PostgreSQL服务:
sudo systemctl start postgresql
sudo systemctl enable postgresql

# 4)配置PostgreSQL允许远程访问
# 编辑PostgreSQL的配置文件pg_hba.conf和postgresql.conf以允许远程访问。
sudo vim /var/lib/pgsql/data/pg_hba.conf
# 在文件最后添加如下几行,允许所有ip访问:
host    all             all             0.0.0.0/0               md5

sudo vim /var/lib/pgsql/data/postgresql.conf
#找到listen_addresses并将其修改为:
listen_addresses = '*'

#5)重启PostgreSQL服务
sudo systemctl restart postgresql

#6)创建数据库和用户
# 切换到postgres用户并创建数据库和用户:
sudo -i -u postgres
psql

#在psql中执行以下命令:
CREATE DATABASE mydatabase;
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword';
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
\q
#退出psql并返回普通用户:exit

基本增删改查

# 1)查看所有数据库:
\l

# 2)连接到某个数据库:
\c <数据库名>

# 3)查看当前数据库中的所有表:
\dt

# 4)查看表的结构(列名、数据类型等):
\d <表名>

# 5)查看表中的所有数据:
SELECT * FROM <表名>;

# 6)删除表
DROP TABLE <表名>

# 1)删除数据库
DROP DATABASE <数据库名>;

Postgresql操作

安装psycopg2

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple psycopg2

python实现增删改查

import psycopg2
from psycopg2 import sql

# 数据库连接参数
conn_params = {
    'dbname': 'mydatabase',
    'user': 'myuser',
    'password': 'mypassword',
    'host': '192.168.40.80',  # 替换为你的服务器IP
    'port': 5432
}

# 连接数据库
conn = psycopg2.connect(**conn_params)
cur = conn.cursor()

# 创建表
create_table_query = """
CREATE TABLE IF NOT EXISTS employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    position VARCHAR(100),
    salary INT
);
"""
cur.execute(create_table_query)
conn.commit()

# 插入数据
insert_query = sql.SQL("INSERT INTO employees (name, position, salary) VALUES (%s, %s, %s)")
cur.execute(insert_query, ('John Doe', 'Software Engineer', 70000))
cur.execute(insert_query, ('Jane Smith', 'Data Scientist', 80000))
conn.commit()

# 查询数据
cur.execute("SELECT * FROM employees")
rows = cur.fetchall()
print("Employees:")
for row in rows:
    print(row)

# 更新数据
update_query = sql.SQL("UPDATE employees SET salary = %s WHERE name = %s")
cur.execute(update_query, (75000, 'John Doe'))
conn.commit()

# 删除数据
delete_query = sql.SQL("DELETE FROM employees WHERE name = %s")
cur.execute(delete_query, ('Jane Smith',))
conn.commit()

# 再次查询数据
cur.execute("SELECT * FROM employees")
rows = cur.fetchall()
print("Employees after update and delete:")
for row in rows:
    print(row)

# 关闭连接
cur.close()
conn.close()

SQLAlchemy与ORM框架操作Postgresql

SQLAlchemy 是一个 Python 的 ORM(对象关系映射)框架,它提供了简洁且强大的方式来操作关系型数据库。通过 SQLAlchemy,开发者可以使用 Python 对象来表示数据库中的表和数据,而不必直接编写 SQL 语句。

安装sqlalchemy

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple sqlalchemy

代码

# create_engine是sqlalchemy终的一个函数,用于创建一个数据库引擎,负责与数据库连接,并执行SQL语句
# Column、Integer、String都是SQLAlchemy终的路类型,用来定义数据库表的列和列的数据类型。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
# sessionmaker这是sqlalchemy用来创建会话的工厂函数
from sqlalchemy.orm import sessionmaker

# 定义基类
# declarative_base是用于创建模型基类的函数。所有的ORM模型类(例如User类)都应该继承这个基类
# Base会提供一本功能,如将类与数据库表映射、生成SQL语句等
Base = declarative_base()

# 定义User模型,继承了Base,意味着这个类是SQLAlchemy ORM模型类,代表数据库中的一个表
class User(Base):
    __tablename__ = 'users'  # 对应数据库中的表名
    # 定义表结构
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String)
    age = Column(Integer)
    # 定义了该类的字符串表示方式。可以自定义打印对象的显示格式,便于调试和输出。
    def __repr__(self):
        return f"<User(name={self.name}, age={self.age})>"

# 数据库连接URL
DATABASE_URL = 'postgresql://myuser:mypassword@192.168.40.80/aa'

# 创建数据库连接引擎
engine = create_engine(DATABASE_URL)

# 创建所有表。这个方法基于ORM模型类创建数据库表。SQL语句会自动生成。
Base.metadata.create_all(engine)

# 创建会话工厂,这是执行数据库增删改查操作的主要接口
Session = sessionmaker(bind=engine)

# 插入数据(增)
def add_user(name, age):
    session = Session() # 返回会话对象。
    new_user = User(name=name, age=age) # 创建一个User对象
    session.add(new_user) # 将新用户添加到会话中。此时还未保存到数据库。
    session.commit()  # 提交事务,实际上将User对象保存到数据库中。
    print(f"User {name} added successfully!")
    session.close() # 关闭会话连接

# 查询数据(查)
def get_user_by_name(name):
    session = Session()
    # 查询User表中的列,User是之前定义的ORM模型类。返回第一条记录。
    user = session.query(User).filter_by(name=name).first()
    if user:
        print(f"Found user: {user}")
    else:
        print(f"No user found with name {name}")
    session.close()

# 更新数据(改)
def update_user_age(name, new_age):
    session = Session()
    user = session.query(User).filter_by(name=name).first()
    if user:
        user.age = new_age
        session.commit()  # 提交事务
        print(f"User {name}'s age updated to {new_age}")
    else:
        print(f"No user found with name {name}")
    session.close()

# 删除数据(删)
def delete_user(name):
    session = Session()
    user = session.query(User).filter_by(name=name).first()
    if user:
        session.delete(user)
        session.commit()  # 提交事务
        print(f"User {name} deleted successfully!")
    else:
        print(f"No user found with name {name}")
    session.close()

# 主程序
if __name__ == "__main__":
    # 增:插入用户
    add_user('Alice', 30)
    add_user('Bob', 25)

    # 查:查询用户
    get_user_by_name('Alice')
    get_user_by_name('Charlie')  # 不存在的用户

    # 改:更新用户年龄
    update_user_age('Alice', 31)

    # 删:删除用户
    delete_user('Bob')
    delete_user('Charlie')  # 不存在的用户