01 ORM

在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢?

和数据库相关,不同的数据库需要写不同的 SQL 语句

使用 ORM 隔离框架和数据库

ORM全称 Object Relational Mapping对象关系映射

通过 ORM 可以不用关心后台是使用的哪种数据库,只需要按照 ORM 所提供的语法规则去书写相应的代码, ORM 就会自动的转换成对应数据库的 SQL 语句 ,一个类对应一张一表.

02 SQLAlchemy连接数据库

第一步:安装

安装: mysql

安装python包: pymysql、sqlalchemy

pip安装 python 包

pip install -i https://pypi.douban.com/simple pymysql

pip install -i https://pypi.douban.com/simple sqlalchemy

这里是使用国内的源

第二步:导入模块

from sqlalchemy import create_engine

第三步:数据库数据

HOSTNAME = '127.0.0.1' #常量用大写

PORT = '3306'

DATABASE = 'mydb'

USERNAME = 'admin'

PASSWORD = 'pswd'

第四步:数据连接 URL

Db_Uri = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(

USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)

第五步:连接数据库

engine = create_engine(Db_Uri)

第六步:测试连接

if __name__ == '__main__':

  connection = engine.connect() result = connection.execute('select 1') print(result.fetchone())

03 Module

第一步:创建 Module 的 Base 类

新建一个base.py文件.

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base(engine)

对象关系型映射,数据库中的表与python中的类相对应,创建的类必须继承自 sqlalchemy 中的基类。

使用 declarative 方法定义的映射类依据一个基类,这个基类是维系类和数据表关系的目录。

应用通常只需要有一个 Base 的实例。我们通过 declarative_base() 功能创建一个基类。

第二步:创建 Module

新建一个user_module.py

from datetime import datetime

from sqlalchemy import Column, Integer, String, DateTime,Boolean

from connect import Base

class User(Base):

   --tablename-- = 'user'

   id = Column(Integer,primary_key=True,autoincrement=True)

   username = Column(String(20),nullable=False)

  password = Column(String(50))

   creatime = Column(DateTime,default=datetime.now)

  update_time = Column(DateTime,default = datetime.now()

  _locked = Colume(Boolean,default=False,nullable=False)

)

再次强调,我们用类来表示数据库里面的表!!!

这些表的类都继承于我们的Base基类。

在类里面我们定义一些属性,这个属性通过映射,就对应表里面的字段

第三步:启动 Module

Base.metadata.create_all()

执行此代码,就会把创建好的 Module 映射到数据库中

Module

--tablename--: 数据库中的表名

Column: 用来创建表中的字段的一个方法

Integer: 整形,映射到数据库中的int类型

String: 字符类型,映射到数据库中的varchar类型,使用时,需要提供一个字符长度

DateTime: 时间类型

通过 SQLAlchemy  提供的语法来声明表

04 增删改查

第一步:创建会话

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(engine) #传入引擎

session = Session()

在对表数据进行增删改查之前,先需要建立会话,建立会话之后才能进行操作,就类似于文件要打开之后才能对文件内容操作

add

person = User(username='buodng', password='qwe123')

session.add(person)

session.commit()

session.add_all([

User(username='tuple', password=2),           User(username='which', password=3)

]) #加多条

add 是添加一条数据, add_all 添加多条数据

query

rows = session.query(User).all()

rows = session.query(User).first()

query 就是查询的意思,在 SQLAlchemy 中也用来查询数据

all 是查询所有的意思

first 是查询第一条数据

在后面会详细介绍更多的用法

update

rows = session.query(User).filter(User.username=='budong').update({User.password:1}) #修改值放到字典里面去.

session.commit()

update  用来更改数据

delete

rows = session.query(User).filter(User.username=='budong')[0]

#用filter查出来的是一条原生的SQL语句

print(rows)

session.delete(rows)

session.commit()

使用 delete 方法来删除数据

tornado框架基础06-SQLAlchemy连接数据库的更多相关文章

  1. tornado框架基础10-websocket

    websocket 01 长轮询 在网页,我们经常扫码登录,结合之前的学习的知识点,来思考下,前端是如何知道用户在手机上扫码登录了呢? 长轮询:客户端不断的向服务器发送请求 缺点: \1. 开销大 \ ...

  2. tornado框架基础11-tornado异步

    01 同步和异步 生活中常常会遇到在超市排队买东西的情况,排在你前面的人没有结算完成,你就无法付账,在计算机中也有类似的情形,一个程序在执行之前,需要等待其他的程序执行完成,大家还能举出其他的例子吗? ...

  3. tornado框架基础08-sqlalchemy表关系和简单登录注册

    01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...

  4. tornado框架基础01-路由简介

    tornado 小而精 Django 大而全 Web框架 Tornado是一个由Python开发的Web框架 Web服务 利用Tornado,可以快速搭建和一个高性能的Web服务 非阻塞 Tornad ...

  5. tornado框架基础09-cookie和session

    01 cookie 在上节,我们简单了解了登录过程,但是很明显,每次都需要登录,但是在平常逛网站的只需要登录一次,那么网站是如何记录登录信息的呢? 有没有什么办法可以让浏览器记住登录信息,下次再次打开 ...

  6. tornado框架基础07-sqlalchemy查询

    01 查询结果 上节使用query从数据库中查询到了结果,但是query返回的对象是直接可用的吗? 首先导入模块 from connect import session from user_modul ...

  7. tornado框架基础05-模板继承、UImodul和UImethods

    01 模板继承 父模板​ <html lang="en"> <head>     <meta charset="UTF-8"> ...

  8. tornado框架基础04-模板基础

    01 模板 模板演示 配置路径 在 application 中配置模板文件和静态文件的路径: template_path='templates', static_path='static', 模板 & ...

  9. tornado框架基础03-请求与响应

    01 请求与响应 请求 浏览器在发送请求的时候,会发送具体的请求信息,由请求行,请求消息头,请求正文 请求消息头 向服务器传递附加信息 Accept: 浏览器可以接受的MIME类型. Accept-C ...

随机推荐

  1. LuoguP1342请柬 【最短路/建反图】By cellur925

    题目传送门 开始就想直接正向跑一遍Dij把到各点的最短路加起来即可,后来发现与样例少了些,于是再读题发现需要也求出学生们回来的最短路. 但是注意到本题是有向图,如果是无向图就好说. 那么我们怎么解决? ...

  2. Shell 根据名称杀掉进程

    代码如下: #!/bin/sh # 从命令行读取进程名称 NAME=$ echo "---------------" echo 'killing ->' $NAME # 过滤 ...

  3. 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作

    我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...

  4. Flexbox布局的基本概念

    flex container(flex容器 或 弹性容器) flex容器是flex元素的的父元素. 通过设置display 属性的值为flex 或 inline-flex定义. 注旧版本的属性值: b ...

  5. _bzoj1191 [HNOI2006]超级英雄Hero【构图 并查集】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1191 以锦囊作为节点,问题作为边“一步一步”构图,当一个时刻,某个联通块中边数>点数, ...

  6. Jenkins视图使用--添加删除视图

    job建立的特别多的时候,我们可能不太容易找到自己的某个job,这时,我们就可以在Jenkins中建立视图.job的视图类似于我们电脑上的文件夹.可以通过一些过滤规则,将已经建好的job过滤到视图中, ...

  7. 动手实现 React-redux(四):mapDispatchToProps

    在重构 ThemeSwitch 的时候我们发现,ThemeSwitch 除了需要 store 里面的数据以外,还需要 store 来 dispatch: ... // dispatch action ...

  8. P2667 超级质数

    https://www.luogu.org/problem/show?pid=2667 题目背景 背景就是描述,描述就是背景...... 题目描述 一个质数如果从个位开始,依次去掉一位数字,两位数字, ...

  9. P1309 瑞士轮 未完成 60

    题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...

  10. 第16周翻译:SQL Server中的事务日志管理,级别3:事务日志、备份和恢复

    源自: http://www.sqlservercentral.com/articles/Stairway+Series/73779/ 作者: Tony Davis, 2011/09/07 翻译:刘琼 ...