sqlalchemy 根据官方文档整理的知识点(还有待补充)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

1、导入sqlalchemy并查看版本
import sqlalchemy
printf(sqlalchemy.version)

2、数据库连接(这里使用mysql database)
from sqlalchemy import create_engine
create_engine("mysql+pymysql://root:1qaz#EDC@127.0.0.1/db_ttr", encoding="utf-8", echo=True)

说明:
mysql+pymysql
mysql 表示使用的mysql数据库
pymysql 表示DBAPI,默认的DBAPI是mysqldb,可通过pip安装pymysql或mysqldb

echo标志是设置SQLAlchemy日志记录的一个快捷方式,它通过Python的标准日志模块实现。
启用它之后,我们将看到生成的所有SQL语句,如果不想输出有任何输出,设置为False即可
create_engine()的返回值是引擎的一个实例,它表示数据库的核心接口

关于连接其他数据库(如oracle、sqlite等)的方法以及create_engine更多的参数请参考官方链接:
http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine

3、声明一个映射
在使用ORM时,配置过程:1、首先描述我们要处理的数据库表,2、然后定义我们自己的类
这些类将映射到这些表。在SQLAlchemy中,这两个任务通常是一起执行的,使用一个名为Declarative,它允许我们创建包含指示的类,用来描述它们将被映射到的实际数据库表。
使用Declarative映射的类被定义为一个基类,它维护一个类和表相对于该基础的目录——这就是所谓的声明基类。
在通常导入的模块中,应用程序通常只有一个实例。我们使用declarative_base()函数创建基类,如下所示:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base() #基类

现在我们有了一个“Base”,我们可以用它来定义任意数量的映射类。我们将从一个名为users的表开始,它将使用我们的应用程序存
储最终用户的记录。一个名为User的新类将是我们映射该表的类。在这个类中,我们定义了将要映射的表的详细信息,
主要是表名,以及列的名称和数据类型:

from sqlalchemy import Column, Integer, String
class User(Base): #User类是映射该表的类
tablename = 'users' #表名users

id = Column(Integer, primary_key=True) #列(或称字段) Integer是数据类型中的整型,primary_key=True设置为主键
name = Column(String(60)) #String数据类型中的字符串,60是长度
fullname = Column(String(60))
password = Column(String(60))

def __repr__(self):
    return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)

# User类定义了__repr__()方法,但请注意,这是可选的; 以便我们的示例显示漂亮的用户对象。

4、创建一个模式
通过使用声明系统构造的用户类,我们已经定义了关于表的信息,即表元数据。
SQLAlchemy用来表示特定表的信息的对象称为table对象,这里声明性已经为我们做了一个。
通过检查table属性,我们可以看到这个对象:
In [10]: User.table
Out[10]: Table('users', MetaData(bind=None), Column('id', Integer(), table=<users>, primary_key=True, nullable=False), Column('name', String(), table=<users>), Column('fullname', String(), table=<users>), Column('password', String(), table=<users>), schema=None)

当我们声明我们的类时,声明使用Python元类,以便在类声明完成后执行其他活动;在这个阶段中,它根据我们的规范创建了一个表对象,
并通过构造一个Mapper对象将其与类关联起来。这个对象是我们通常不需要直接处理的幕后对象(尽管它可以提供大量关于我们需要它的映射的信息)。
表对象是一个称为元数据的更大集合的成员。当使用声明性的时候,这个对象可以使用。我们声明基类的元数据属性。元数据是一个注册表,
它包括向数据库发出有限的模式生成命令集的能力。由于我们的SQLite数据库实际上没有一个用户表,所以我们可以使用元数据为所有不存在的表向数据库发出CREATE table语句。
下面,我们调用MetaData.create_all()方法,将引擎作为数据库连接的源传递。我们将看到,首先发出特殊命令来检查users表的存在,
然后执行实际的CREATE table语句:

Base.metadata.create_all(engine) #执行实际的CREATE table语句,只有执行了这个语句才会真正的在数据库里创建表和插入数据

5、创建映射类的一个实例
通过完成映射,现在让我们创建并检查一个用户对象:
ed_user = User(name='tianran', fullname='tantianran', password='1qaz#EDC')

6、创建一个会话
现在我们可以开始与数据库对话了。ORM对数据库的“句柄”是会话。当我们第一次设置应用程序时,
在与create_engine()语句相同的级别上,我们定义了一个会话类,它将作为新会话对象的工厂:

>> from sqlalchemy.orm import sessionmaker
>> Session = sessionmaker(bind=engine)

这个定制的会话类将创建绑定到我们数据库的新会话对象。在调用sessionmaker时也可以定义其他事务特性;
这些将在后面的章节中描述。然后,每当需要与数据库进行对话时,就实例化一个会话:
session = Session()

7、添加和更新对象
Session = sessionmaker(bind=engine)
session = Session()
session.add(ed_user)

在这一点上,我们说实例正在等待;还没有发出SQL,而且该对象还没有被数据库中的一行表示。会话将会发出SQL,在需要的时候,使用被称为“刷新”的进程,将琼斯尽快持久化。
如果我们为Ed Jones查询数据库,所有待处理的信息将首先被刷新,然后在此后立即发出查询。
例如,在下面我们创建一个新的查询对象,它加载用户实例。我们“过滤”了ed的name属性,
并指出我们只希望第一个结果出现在完整的行列表中。返回一个用户实例,
它相当于我们添加的内容:
our_user = session.query(User).filter_by(name='ed').first() 
print(our_user)

我们可以使用add_all()添加更多的用户对象:
session.add_all([
User(name='wendy', fullname='Wendy Williams', password='foobar'),
User(name='mary', fullname='Mary Contrary', password='xxg527'),
User(name='fred', fullname='Fred Flinstone', password='blah')]
)

如需要单独更新一条记录:
ed_user.password = 'f8s7ccs'

查看哪些记录是被修改过的:
session.dirty

查看等待提交的对象
session.new

提交会话(只有执行了这一步才会真在的将数据写入到数据库)
session.commit()

8、回滚操作
session.rollback()

如做了一些修改,在没有执行session.commit()之前,都可以进行回滚操作

9、查询
for instance in session.query(User).order_by(User.id):
print(instance.id,instance.name, instance.fullname, instance.password)

关于更多的查询方法,参见官方文档:http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query

10、创建的过滤操作符

更多关于过滤操作请参见官方文档:http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.filter

11、返回列表和标量
待补充。。。。
12、使用文本sql
待补充。。。
13、计数
待补充。。。
14、建立一个关系
待补充。。。



本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/2048610

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
存储 程序员 Go
常用函数整理(基础篇)
常用函数整理(基础篇)
207 2
常用函数整理(基础篇)
|
前端开发 JavaScript
【React工作记录九十三】前端小知识点扫盲笔记记录2
【React工作记录九十三】前端小知识点扫盲笔记记录2
48 0
|
存储 机器学习/深度学习 Rust
Rust 快速入门60分① 看完这篇就能写代码了
Rust 快速入门60分① 看完这篇就能写代码了
476 1
|
NoSQL MongoDB Python
不看官方文档,这个问题你可能会束手无策
不看官方文档,这个问题你可能会束手无策
109 0
|
设计模式 缓存 Java
面试题 | 怎么写一个又好又快的日志库?(一)(下)
面试题 | 怎么写一个又好又快的日志库?(一)
130 0
|
设计模式 JavaScript 前端开发
看文档不如看源码系列热身 - Redux 源码全解析
众所周知,前端轮子太多,大部分同学每次学习新轮子都是学完不用就忘。我最近看一些库,其实这些库的实现都很简单,但是文档往往又很多,甚至还有些文档说的不清不楚,偶尔用到了都要去查文档,细节一点的东西文档又往往无法体现,感觉还不如将看文档的时间用来看源码。这些库的源码往往很精简,看完了既能知道如何使用,还能知其所以然,不亏。所以有了这个系列。
|
SQL 算法 中间件
sqlalchemy源码阅读-下篇
SQLAlchemy是Python SQL工具箱和ORM框架,它为应用程序开发人员提供了全面而灵活的SQL功能。它提供了一整套企业级持久化方案,旨在高效,高性能地访问数据库,并符合Pythonic之禅。项目代码量比较大,接近200个文件,7万行代码, 我们一起来挑战一下。
424 1
sqlalchemy源码阅读-下篇
|
SQL 安全 关系型数据库
SQLAlchemy源码阅读-上篇
SQLAlchemy是Python SQL工具箱和ORM框架,它为应用程序开发人员提供了全面而灵活的SQL功能。它提供了一整套企业级持久化方案,旨在高效,高性能地访问数据库,并符合简单的Pythonic哲学。项目代码量比较大,接近200个文件,7万行代码, 我们一起来挑战一下。 作者:游戏不存在 链接:https://juejin.cn/post/6951945198322581518 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
316 2
SQLAlchemy源码阅读-上篇
|
存储 数据采集 JavaScript
这次彻底搞懂Vuex!(小白级别教程)
前言 今天这篇文章的主题是Vuex,所以看这篇文章之前最好是要有一定Vue基础的,没有学过Vue的话我建议先去看看Vue.js。不过我相信,对于前端小伙伴来说,Vue框架或多或少都会接触到。好了,话不多说,接下来进入正题: 注意:Vue-cli的版本不同可能生成的项目目录和方法也不同,无需在意这些。
571 0
这次彻底搞懂Vuex!(小白级别教程)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(二)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(二)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(二)