Python SQLAlchemy数据库连接与查询操作详解

落日邮差
落日邮差
发布时间:2026-10-13| 2人浏览过
原创

本文详细介绍Python中如何使用SQLAlchemy模块连接各类数据库,涵盖MySQL、PostgreSQL等常见引擎配置。通过完整示例演示模型定义、Session会话创建、数据查询(filter、order_by)、结果映射为DataFrame以及聚合统计等核心操作,帮助开发者快速掌握SQLAlchemy在Python项目中的实际应用。

SQLAlchemy数据库连接与基础配置

本文通过具体实例,解析Python中利用SQLAlchemy模块进行数据库连接的操作流程,供读者参考学习。

首先需完成环境安装。

环境安装与驱动配置


pip install sqlalchemy
# 安装数据库驱动:
pip install pymysql
pip install cx_oracle

具体示例中,建议在数据库连接URL后追加?charset=utf8参数,以避免字符编码导致的乱码问题。

数据库引擎创建与连接


from sqlalchemy import create_engine
engine=create_engine('mysql+pymysql://username:password@hostname:port/dbname', echo=True) #echo=True 打印sql语句信息

核心函数create_engine接收一个数据库连接URL字符串作为参数。

常见数据库URL格式示例


# '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
# 常用的
engine = create_engine('sqlite:///:memory:', echo=True)   # sqlite内存
engine = create_engine('sqlite:///./cnblogblog.db',echo=True) # sqlite文件
engine = create_engine("mysql+pymysql://username:password@hostname:port/dbname",echo=True) # mysql+pymysql
engine = create_engine('mssql+pymssql://username:password@hostname:port/dbname',echo=True) # mssql+pymssql
engine = create_engine('postgresql://scott:tiger@hostname:5432/dbname') # postgresql示例
engine = create_engine('oracle://scott:tiger@hostname:1521/sidname') # oracle
engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname') #pdb就可以用tns连接

以下是一个基础的使用示例:

模型定义与Session会话管理


from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base 
engine = create_engine('oracle://spark:a@orclpdb',echo=True) #echo要求打印sql语句等调试信息
session_maker = sessionmaker(bind=engine)
session = session_maker()
Base = declarative_base()
#对应一张表
class Student(Base): 
  __tablename__ = 'STUDENT'
  id = Column('STUID', Integer, primary_key=True)
  name = Column('STUNAME', String(32), nullable=False)
  age = Column('STUAGE', Integer)
  def __repr__(self):
    return '<Student(id:%s, name:%s, age:%s)>' % (self.id, self.name, self.age)
Base.metadata.create_all(engine) #若存在STUDENT表则不做,不存在则创建。
queryObject = session.query(Student).order_by(Student.id.desc())
for ins in queryObject:
  print(ins.id, ins.name, ins.age)
'''
4 hey 24
3 lwtxxs 27
2 gyb 89
1 ns 23
'''

实现将数据库查询结果直接映射为Pandas DataFrame对象的功能。

查询结果映射为DataFrame


import pandas as pd
df = pd.read_sql(session.query(Student).filter(Student.id > 1).statement, engine) 
print(df)
'''
  STUID STUNAME STUAGE
0   4   hey   24
1   2   gyb   89
2   3 lwtxxs   27
'''

接下来介绍具体的数据查询方法。

Session对象的query方法不仅接受Base类的子类作为参数,还可以直接指定特定的字段。

字段查询与结果遍历


query = session.query(Student.name, Student.age) # query为一个sqlalchemy.orm.query.Query对象
for stu_name, stu_age in query:
  print(stu_name, stu_age)

在查询过程中,可以使用filter方法来添加过滤条件。

查询条件Filter用法详解


# = / like
query.filter(Student.name == 'wendy')
query.filter(Student.name.like('%ed%'))
# in
query.filter(Student.name.in_(['wendy', 'jack']))
query.filter(Student.name.in_(
    session.query(User.name).filter(User.name.like('%ed%'))
))
# not in
query.filter(~Student.name.in_(['ed', 'wendy', 'jack']))
# is null / is not null
query.filter(Student.name == None)
query.filter(Student.name.is_(None))
query.filter(Student.name != None)
query.filter(Student.name.isnot(None))
# and
from sqlalchemy import and_, or_
query.filter(and_(Student.name == 'ed', Student.age != 23))
query.filter(Student.name == 'ed', Student.age != 23)
query.filter(Student.name == 'ed').filter(Student.age != 23)
# or
query.filter(or_(Student.name == 'ed', Student.name == 'wendy'))
# match
query.filter(Student.name.match('wendy'))

Query对象提供了多种常用的操作方法。

其中,all()方法会以列表形式返回所有匹配的结果集。

结果集获取方法:all与first


from sqlalchemy import or_, and_
queryObject = session.query(Student).filter(or_(Student.id == 1, Student.id == 2))
print(queryObject.all())  # [<Student(id:1, name:ns, age:23)>, <Student(id:2, name:gyb, age:89)>]
queryObject = session.query(Student.name).filter(or_(Student.id == 1, Student.id == 2))
print(queryObject.all())  # [('ns',), ('gyb',)]

first()方法用于返回单个结果,如果查询结果集为空,则返回None。

精确结果获取:one与one_or_none


print(queryObject.first())  # ('ns',)

one()方法同样返回单个结果,但与first()方法的区别在于:当结果集中没有元素或包含多于一个元素时,该方法会抛出异常。 此外,one_or_none()方法与one()类似,不同之处在于:当结果集为空时返回None,而当结果集包含多个元素时会抛出异常。

统计查询数量的方法如下:

聚合统计与分组查询


from sqlalchemy import func
session.query(func.count(Student.id)).scalar() # SELECT count("STUDENT"."STUID") AS count_1 FROM "STUDENT"

进行数据分组统计的操作示例:


session.query(func.count(Student.id), Student.name).group_by(Student.name).all()

关于嵌套SQL语句的使用方式:

原生SQL语句执行


from sqlalchemy import text
query = session.query(Student.id, Student.name).filter(text('stuid>2'))
query = session.query('stuid', 'stuname', 'stuage').from_statement(\
text("select * from student where stuname=:stuname")).params(stuname='hey').all()  #[(4, 'hey', 24)]

若读者对Python的其他数据库操作技巧感兴趣,可参考本站专题:《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。

希望上述内容能对各位的Python编程实践提供有益帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。