2Python全栈之路系列之SQLAchemy

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

Python全栈之路系列之SQLAlchemy


SQLAlchemy的是Python SQL工具包和对象关系映射器,让应用程序开发者的全部功能和SQL的灵活性。

它提供了一套完整的众所周知的企业级持久性模式,专为高效率和高性能的数据库访问,改编成一个简单的Python化领域语言。


SQLAlchemy的哲学

SQL数据库的行为不像对象集合的较具规模和业绩开始关系; 对象集合表现得不像越抽象开始关系表和行。 SQLAlchemy的目的是满足这两个原则。

SQLAlchemy认为数据库是关系代数发动机,而不仅仅是一个表的集合,行可以不仅从表中选择,但也加入和其他select语句; 任何这些单元可被组合成一个较大的结构,SQLAlchemy的表达式语言基础上,从它的核心这个概念。

SQLAlchemy是最有名的对象关系映射器(ORM),提供数据映射模式 ,其中类可以在开放式的,多种方式被映射到数据库中的可选组件-允许对象模型和数据库模式中,以开发干净地分离从开始方式。

SQLAlchemy的对这些问题的总体思路是大多数其它SQL/ORM工具,根植于所谓的complimentarity-导向的方式完全不同; 而不是藏起来了SQL和关系对象的细节自动化墙后面,所有的进程都充分一系列组合的,透明的工具中暴露出来 。 该库发生在自动冗余任务的工作,而开发商仍然在数据库中是如何组织和SQL是如何构造的控制。

SQLAlchemy的主要目标是改变你对数据库和SQL的方式!

SQLAlchemy的使用

数据库的连接

MySQL-Python

1
mysql + mysqldb: / / <user>:<password>@<host>[:<port>] / <dbname>

pymysql

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

MySQL-Connector

1
mysql + mysqlconnector: / / <user>:<password>@<host>[:<port>] / <dbname>

查看版本

1
2
3
>>>  import  sqlalchemy
>>> sqlalchemy.__version__
'1.0.14'

创建与删除表

单表创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
 
import  sqlalchemy
from  sqlalchemy  import  create_engine
from  sqlalchemy.ext.declarative  import  declarative_base
from  sqlalchemy  import  Column, Integer, String, Index, UniqueConstraint, ForeignKey
from  sqlalchemy.orm  import  sessionmaker
 
engine  =  create_engine( 'mysql+pymysql://root:as@127.0.0.1:3306/tesql?charset=utf8' , echo = True )   # echo=True输出生成的SQL语句
 
Base  =  declarative_base()   # 生成一个ORM基类
 
class  UserInfo(Base):
     __tablename__  =  'UserInfo'   # 表名
     """
     创建字段
     index=True  普通索引
     unique=T  唯一索引
     """
     id  =  Column(Integer, primary_key = True , autoincrement = True )   # primary_key=主键,autoincrement=自增
     name  =  Column(String( 32 ))
     password  =  Column(String( 16 ))
     
     __table_args__  =  (
         Index( 'id' 'name' ),   # 联合索引
         UniqueConstraint( 'name' 'password' , name = 'name_password' )   # 联合唯一索引,name索引的名字
     )
     
     # 让查询出来的数据显示中文
     def  __repr__( self ):
         return  self .name
         
Base.metadata.create_all(engine)   # 把所有集成Base类的类,创建表结构

上面的代码其实就是创建了一个UserInfo表,包含了三个字段,实际执行的SQL语句如下:

1
2
3
4
5
6
7
CREATE TABLE `UserInfo` (
     id  INTEGER NOT NULL AUTO_INCREMENT, 
     name VARCHAR( 32 ), 
     password VARCHAR( 16 ), 
     PRIMARY KEY ( id ), 
     CONSTRAINT name_password UNIQUE (name, password)
)

因为在创建引擎的时候加入了echo=True,所以执行的SQL会在控制台输出出来,以便于我们排查问题。

创建一对多表

1
2
3
4
5
6
7
8
9
class  Favor(Base):
     __tablename__  =  'favor'
     nid  =  Column(Integer, primary_key = True , autoincrement = True )
     caption  =  Column(String( 50 ), default = 'red' , unique = True )
     
class  Person(Base):
     __tablename__  =  'person'
     nid  =  Column(Integer, primary_key = True , autoincrement = True )
     favor_id  =  Column(Integer, ForeignKey( "favor.nid" ))

创建多对多表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 组
class  Group(Base):
     __tablename__  =  'group'
     id  =  Column(Integer, primary_key = True )
     name  =  Column(String( 64 ), unique = True , nullable = False )
     port  =  Column(Integer, default = 22 )
     
# 服务器
class  Server(Base):
     __tablename__  =  'server'
     id  =  Column(Integer, primary_key = True , autoincrement = True )
     hostname  =  Column(String( 64 ), unique = True , nullable = False )
     
# 服务器组,第三张表
class  ServerToGroup(Base):
     __tablename__  =  'servertogroup'
     nid  =  Column(Integer, primary_key = True , autoincrement = True )
     server_id  =  Column(Integer, ForeignKey( 'server.id' ))
     group_id  =  Column(Integer, ForeignKey( 'group.id' ))

删除表

1
Base.metadata.drop_all(engine)   # 把所有集成Base类的类,删除表

操作表

增加数据

添加单条数据

1
2
3
4
5
6
7
8
9
10
11
MySesion  =  sessionmaker(bind = engine)
session  =  MySesion()
 
# 创建一条数据
users  =  UserInfo(name = 'Hello' , password = 'World' )
 
# 把数据添加到表内
session.add(users)
 
# 提交生效
session.commit()

添加多少数据

1
2
3
4
5
6
session.add_all([
     UserInfo(name = 'A' , password = '1' ),
     UserInfo(name = 'B' , password = '2' )
])
# 提交
session.commit()

删除数据

1
2
session.query(UserInfo). filter (UserInfo.name  = =  'a' ).delete()
session.commit()

查询

获取某个表中的所有内容

1
2
result  =  session.query(UserInfo). all ()
print (result)

修改数据

1
2
session.query(UserInfo). filter (UserInfo. id  = =  8 ).update({ "name" "ffff" })
session.commit()

查询数据

获取所有

1
result  =  session.query(UserInfo). all ()

获取指定字段

1
result  =  session.query(UserInfo.name, UserInfo.password). all ()

获取指定的

1
result  =  session.query(UserInfo).filter_by(name = 'b' ). all () # 返回的是一个列表

获取第一条

1
2
3
result  =  session.query(UserInfo).filter_by(name = 'b' ).first()
# 获取值中的某个属性
result.name

获取数据出现的个数

1
result  =  session.query(UserInfo).filter_by(name = 'b' ).count()

使用and_or_进行查询

导入and_or_模块

1
from  sqlalchemy  import  and_, or_

and_

1
2
for  row  in  session.query(UserInfo). filter (and_(UserInfo.name  = =  'A' , UserInfo.password  = =  1 )):
     print (row)

or_

1
2
for  row  in  session.query(UserInfo). filter (or_(UserInfo.name  = =  'Hello' , UserInfo.password  = =  1 )):
     print (row)

关联查询

创建以下数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
 
from  sqlalchemy  import  create_engine
from  sqlalchemy.orm  import  sessionmaker, relationships
from  sqlalchemy  import  Column, Integer, String, Index, UniqueConstraint, ForeignKey
from  sqlalchemy.ext.declarative  import  declarative_base
 
engine  =  create_engine( 'mysql+pymysql://root:as@127.0.0.1:3306/tesql' )
 
Base  =  declarative_base()
 
class  Son(Base):
     __tablename__  =  'son'
     id  =  Column(Integer, primary_key = True )
     name  =  Column(String( 32 ))
     father  =  relationship( 'Father' )
     # 创建外键
     father_id  =  Column(Integer, ForeignKey( 'father.id' ))
     
class  Father(Base):
     __tablename__  =  'father'
     id  =  Column(Integer, primary_key = True )
     name  =  Column(String( 32 ))
     son  =  relationship( 'Son' )
     # son = relationship('Son', backref='Father') 相当于上面两个relationship
     
# 生成表
Base.metadata.create_all(engine)

往表里添加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Session  =  sessionmaker(bind = engine)
session  =  Session()
 
# 添加父亲的数据
=  Father(name = 'as' )
session.add(F)
session.commit()
 
# 添加儿子的数据
S1  =  Son(name = 'Son1' , father_id = 1 )
S2  =  Son(name = 'Son2' , father_id = 1 )
session.add_all([S1, S2])
session.commit()
 
# 另外一种添加数据的方式
=  session.query(Father).filter_by( id = 1 ).first()
S3  =  Son(name = 'Son3' )
# 要用追加的方式进行添加,F.son是一个列表,如果不用append将会把之前的数据对应的值进行删除
F.son.append(S3)
session.add(F)
session.commit()

通过父亲找到所有的儿子

1
2
3
result  =  session.query(Father).filter_by(name = 'as' ).first()
for  in  result.son:
     print (n.name)

通过儿子找到父亲

1
2
3
4
result  =  session.query(Son).filter_by(name = 'Son2' ).first()
print (result.father.name, result.name)
# son = relationship('Son', backref='Father')
# print(result.father.name, result.name)

join

1
2
3
4
5
6
result  =  session.query(Father.name.label( 'kkk' ), Son.name.label( 'ppp' )).join(Son)
# label('kkk')相当于起了一个别名,等于sql中的as
print (result)
>>>>>
SELECT father.name AS kkk, son.name AS ppp 
FROM father JOIN son ON father. id  =  son.father_id

多对多实例

在上面的多对多的代码中的Server类加入一下代码:

1
2
=  relationship( "Group" , secondary = ServerToGroup.__table__, backref = 's' )
# secondary 如果有第三张表自动加进来

然后生成数据库表.

添加组与主机的数据

1
2
3
4
5
6
7
8
G1  =  Group(name = 'G1' , port = 22 )
G2  =  Group(name = 'G2' , port = 22 )
 
S1  =  Server(hostname = 'Linux-node1' )
S2  =  Server(hostname = 'Linux-node2' )
 
session.add_all([G1, G2, S1, S2])
session.commit()

往第三张表里面添加关联数据

1
2
3
4
GS1  =  ServerToGroup(server_id = 1 , group_id = 1 )
GS2  =  ServerToGroup(server_id = 2 , group_id = 2 )
session.add_all([GS1, GS2])
session.commit()

通过relationship进行数据的添加

1
2
3
4
5
6
7
8
9
10
# 获取ID=1的主机
=  session.query(Server).filter_by( id = 1 ).first()
# 获取所有主机组
=  session.query(Group). all ()
 
S.g  =  G
# 添加数据
session.add_all([S, ])
# 提交到数据库中
session.commit()









本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1919100,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
7月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
352 1
|
8月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
543 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
737 45
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
402 2
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
841 0
|
前端开发 JavaScript 测试技术
Python中的全栈开发
【6月更文挑战第6天】本文探讨了Python在全栈开发中的应用,展示了如何利用Python的Django和Flask框架进行后端开发,以及与JavaScript前端框架的集成。文中通过示例介绍了Django和Flask的基本用法,并讨论了全栈开发中的前端集成、CORS问题、数据传输、身份验证、异步编程、性能优化、日志记录、错误处理、测试、安全性、数据库集成、实时通信、缓存和扩展功能。此外,还强调了全栈开发涉及的团队协作、项目管理和用户体验,指出Python为全栈开发提供了强有力的支持。
|
测试技术 数据库 开发者
Python全栈测试开发Chapter11 Mock测试
总结起来,Mock测试是一种有效的隔离测试环境、提高测试效率的方法,它让我们能够在不依赖外部条件的情况下进行全面的单元测试。在Python全栈测试中,Mock的应用是一种非常实用的技能。
207 0
|
Python
老男孩&路飞学城Python全栈
老男孩&路飞学城的Python全栈开发重点班由ALEX老师主讲,核心教学内容,100多天课程,近100G资料,含基础到实战。一线技术专家亲授,以案例教学引导学生逐步进入项目实战。
357 1
老男孩&路飞学城Python全栈
|
安全 前端开发 JavaScript
Python 全栈安全(三)(4)
Python 全栈安全(三)
119 1
|
XML SQL 安全
Python 全栈安全(三)(3)
Python 全栈安全(三)
238 1

推荐镜像

更多