python sqlalchemy使用

ORM是一种技术,用于将对象模型转换为关系数据库结构,简化数据库操作。本文介绍了ORM的基本概念、核心原则,并通过Python的SQLAlchemy库展示了如何创建数据库引擎、定义表结构以及进行数据的增删改查操作。通过ORM,开发者可以更专注于业务逻辑,而不是重复的数据访问代码。

一、ORM 框架简介

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

1.ORM方法论基于三个核心原则:
简单性:以最基本的形式建模数据。
传达性:数据库结构被任何人都能理解的语言文档化。
精确性:基于数据模型创建正确标准化了的结构。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。O/R中字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。

当开发一个应用程序的时候(不使用O/R Mapping),可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。

如果开你最近的程序,看看DAL代码,肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。  除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/R Mapping。用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。对象关系映射成功运用在不同的面向对象持久层产品中,

  1. 一般的ORM包括以下四部分:
    一个对持久类对象进行CRUD操作的API;
    一个语言或API用来规定与类和类属性相关的查询;
    一个规定mapping metadata的工具;
    一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。
    •ORM:及Object-Relational Mapping,把关系数据库的表结构映射到对象上

•我们先来可能一个例子:

•如果我们从数据库查出来几条数据,需要你在python中表示出来,如果你没有接触过ORM技术,你或许会使用下面的形式来存储这个数据:

[
  (1, ‘feng’),
  (2, ‘shang’),
  (3, ‘huo’),
]

如果你想知道表结构是什么样的,是不是就费劲了,如果你想快速的取出其中的元素,就需要听听ORM的思想了。

数据库中每次查出来的数据都用一个类表示,这个类的属性和数据库中表的字段一一对应。多条数据,就是一个list,每一行数据都是一个类来表示,如下所示:

class User(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name

[
    User(1, “feng”),
    User(2, “shang”),
    User(3, “huo”),
]

当我们需要获得id,或者name的时候,只需要通过循环获取到对象,直接通过user1.id或者user1.name就可以获取到id和name的属性。并且使得数据的存取非常的规范,这样ORM架构应用而生。
以上参考:
作者:俊采星驰_87e0
链接:https://www.jianshu.com/p/0ad18fdd7eed

sqlalchemy使用

安装
pip install SQLALchemy
创始化链接
from sqlalchemy import create_engine
engine = create_engine('mysql://fxq:123456@192.168.100.101/sqlalchemy', echo=True)
# echo = True 显示每条执行的sql语句
创建表格
SQL语句方式
from sqlalchemy import create_engine,MetaData,Table,Column,Integer,String



engine = create_engine("mysql+pymysql://datacenter_test:9n%vtvR633CYcdmm"
                       "@rm-2ze72mtf4661y9szq.mysql.rds.aliyuncs.com/datacenter_test",echo=True)

"""一、SQL语句创建表格"""

sql = '''create table student(id int not null primary key,name varchar(50),age int,address varchar(100));
'''

conn = engine.connect()
conn.execute(sql)
engine.connect()
ORM方式创建
from sqlalchemy import create_engine,MetaData,Table,Column,Integer,String



engine = create_engine("mysql+pymysql://datacenter_test:9n%vtvR633CYcdmm"
                       "@rm-2ze72mtf4661y9szq.mysql.rds.aliyuncs.com/datacenter_test",echo=True)

"""以ORM方式创建表格"""

metadata = MetaData(engine)
student = Table("surf",metadata,
                Column("id",Integer,primary_key=True),
                Column("name",String(50)),
                Column("age",Integer),
                Column("address",String(100)))
metadata.create_all(engine)

创建对象基类,基于基类生成实例,提交到数据库

from sqlalchemy import Column,String,Integer,create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base


"""增删改查"""

# 初始化连接数据库
engine = create_engine("mysql+pymysql://datacenter_test:9n%vtvR633CYcdmm"
                       "@rm-2ze72mtf4661y9szq.mysql.rds.aliyuncs.com/datacenter_test")

# 创建DBSession
DBSession = sessionmaker(bind=engine)
# 创建session对象
session = DBSession()
# 创建对象基类
Base = declarative_base()

class Student(Base):
    __tablename__ = "student"
    id = Column(Integer,primary_key=True)
    name = Column(String(30))
    age = Column(Integer)
    address = Column(String(100))

# ---------------------------------增--------------------------------
student1 = Student(id=1001,name="ling",age=25,address="beijing")
student2 = Student(id=1002,name="molin",age=18,address="jiangxi")
student3 = Student(id=1003,name="karl",age=26,address="suzhou")

# 添加到session
session.add_all([student1,student2,student3])
session.commit()
session.close()

查找、修改

from sqlalchemy import Column,String,Integer,create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base


"""增删改查"""

# 初始化连接数据库
engine = create_engine("mysql+pymysql://datacenter_test:9n%vtvR633CYcdmm"
                       "@rm-2ze72mtf4661y9szq.mysql.rds.aliyuncs.com/datacenter_test")

# 创建DBSession
DBSession = sessionmaker(bind=engine)
# 创建session对象
session = DBSession()
# 创建对象基类
Base = declarative_base()

class Student(Base):
    __tablename__ = "student"
    id = Column(Integer,primary_key=True)
    name = Column(String(30))
    age = Column(Integer)
    address = Column(String(100))

# ---------------------------------查,改--------------------------------

# session.query(Student) 结果是SQL语句
my_student = session.query(Student).filter_by(name="ling",age=25).first()
my_student.id = 1001
# 修改后提交
session.commit()
my_sdt = session.query(Student).filter(Student.name == "ling" and Student.age==25).all()
print(my_sdt)
print(my_sdt.id)

filter的使用
equals:
query(Student).filter(Student.id == 10001)
not equals:
query(Student).filter(Student.id != 100)
LIKE:
query(Student).filter(Student.name.like(“%feng%”))

IN:
query(Student).filter(Student.name.in_(['feng', 'xiao', 'qing']))
not in
query(Student).filter(~Student.name.in_(['feng', 'xiao', 'qing']))

AND:
from sqlalchemy import and_
query(Student).filter(and_(Student.name == 'fengxiaoqing', Student.id ==10001))

或者
query(Student).filter(Student.name == 'fengxiaoqing').filter(Student.address == 'chengde')

OR:
from sqlalchemy import or_
query.filter(or_(Student.name == 'fengxiaoqing', Student.age ==18))

filter和filter_by的区别
Filter: 可以像写 sql 的 where 条件那样写 > < 等条件,但引用列名时,需要通过 类名.属性名 的方式。
filter_by: 可以使用 python 的正常参数传递方法传递条件,指定列名时,不需要额外指定类名。,参数名对应名类中的属性名,但似乎不能使用 > < 等条件。

当使用filter的时候条件之间是使用“==",fitler_by使用的是"="。

user1 = session.query(User).filter_by(id=1).first()
user1 = session.query(User).filter(User.id==1).first()
删除

删除其实也是跟查询相关的,直接查出来,调用delete()方法直接就可以删除掉。

session.query(Student).filter_by(id=1002).delete()
session.commit()
<think>我们正在回答用户关于“Python SQLAlchemy使用示例”的问题。根据之前的对话历史,用户之前询问了Python是否支持MyBatis,而我们介绍了mybatis-py以及SQLAlchemy等替代方案。现在用户明确要求获取SQLAlchemy使用示例,并且提供了几条引用(引用[1]到引用[4])作为背景信息。 根据引用内容,我们得知: - SQLAlchemy有两种模式:ORM和Core(SQL表达式语言)。 - 引用中提供了ORM定义数据模型、数据库连接创建(包括连接池设置)以及执行SQL语句的示例片段。 因此,我们的回答将围绕SQLAlchemy的两种模式给出使用示例,并尽可能涵盖以下要点: 1. 安装SQLAlchemy 2. 连接数据库(使用create_engine) 3. 使用ORM模式: - 定义模型(继承自declarative_base) - 创建会话(Session) - 基本的增删改查操作 4. 使用Core模式(SQL表达式语言): - 创建元数据(MetaData) - 定义表结构 - 执行查询(使用select等) 此外,注意引用中提到的连接池设置(pool_size, max_overflow等)和echo参数(用于输出SQL语句)也可以在我们的示例中体现。 最后,按照要求,我们需要在回答末尾生成相关问题。 注意:由于引用中并没有给出完整的ORM操作示例,我们将结合SQLAlchemy的常规用法来编写示例代码。 步骤: 1. 安装(如果需要提及的话) 2. 连接数据库(engine创建) 3. ORM示例: - 定义Base和User模型 - 创建表 - 创建会话,添加用户,查询,更新,删除等 4. Core示例: - 定义表(使用Table) - 插入数据(insert) - 查询(select) 我们将按照上述步骤给出示例代码,并加上必要的注释。 注意:由于用户可能使用不同的数据库,我们以SQLite为例(无需安装数据库服务器),但也会展示如何连接MySQL使用pymysql驱动)和PostgreSQL等(根据引用[4]中的mysql示例)。 同时,按照用户要求,在回答末尾生成相关问题。 由于引用标记要求:引用到的内容在末尾自然添加引用标识。我们在回答中会引用到提供的引用[1]、[3]、[4](因为引用[2]更像是介绍性的,没有具体方法)。 开始构建回答: </think>### Python SQLAlchemy 使用示例详解 SQLAlchemyPython 强大的 ORM 框架,支持两种核心模式:**ORM(对象关系映射)** 和 **Core(SQL 表达式语言)**[^1][^2]。以下是详细使用示例: --- #### 1. **数据库连接配置** ```python from sqlalchemy import create_engine # MySQL 连接示例(需安装 pymysql) engine = create_engine( 'mysql+pymysql://user:password@localhost:3306/mydb', echo=True, # 打印SQL语句 pool_size=5, # 连接池大小 max_overflow=10, # 允许超出pool_size的连接数 pool_recycle=3600 # 连接回收时间(秒) )[^3][^4] # SQLite 简化连接 engine = create_engine('sqlite:///mydatabase.db') ``` --- #### 2. **ORM 模式示例** **模型定义与 CRUD 操作** ```python from sqlalchemy import Column, Integer, String from sqlalchemy.orm import declarative_base, sessionmaker Base = declarative_base() # 定义 User 模型类 class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) email = Column(String(100)) # 创建表 Base.metadata.create_all(engine) # 创建会话 Session = sessionmaker(bind=engine) session = Session() # 插入数据 new_user = User(name="张三", email="zhangsan@example.com") session.add(new_user) session.commit() # 查询数据 user = session.query(User).filter_by(name="张三").first() print(f"用户ID: {user.id}, 邮箱: {user.email}") # 更新数据 user.email = "new_email@example.com" session.commit() # 删除数据 session.delete(user) session.commit() ``` #### 3. **Core 模式示例** **SQL 表达式语言** ```python from sqlalchemy import MetaData, Table, select metadata = MetaData() # 定义表结构 users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('email', String)) # 执行原生 SQL 查询 with engine.connect() as conn: result = conn.execute( select(users).where(users.c.name == "张三") ) for row in result: print(f"Core查询结果: {row.name}, {row.email}") ``` --- #### 4. **高级功能示例 **连接池管理** ```python # 查看连接池状态 print(f"当前连接数: {engine.pool.status()}") # 手动回收连接 engine.dispose() ``` **事务管理** ```python try: with session.begin(): # 原子操作 user1 = User(name="李四", email="lisi@test.com") user2 = User(name="王五", email="wangwu@test.com") session.add_all([user1, user2]) except Exception as e: print(f"事务回滚: {str(e)}") session.rollback() ``` --- ### 两种模式对比 | 特性 | ORM 模式 | Core 模式 | |--------------|-----------------------------|------------------------| | 抽象层级 | 高级(面向对象) | 中级(类SQL语法) | | 开发效率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | | 性能优化 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | | 复杂查询支持 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | | 适用场景 | 常规业务逻辑 | 报表/大数据操作 | > 提示:实际项目中常混合使用两种模式,ORM 处理基础 CRUD,Core 处理复杂查询[^1][^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值