连接数据库

默认是MySQLdb

指定引擎

dialect[+driver]: //user:password@host/dbname[?key=value..]:

from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:root@127.0.0.1/ormreview?charset=utf8",
encoding='utf8') # 判断是否连接成功
with engine.connect() as f:
result = f.execute("select 1")
print(result.fetchone())
print(type(result))
>>>
# (1,)
#<class 'sqlalchemy.engine.result.ResultProxy'>

ORM模型创建

必须继承自sqlalchemy提供的基类

from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime engine = create_engine("mysql+pymysql://root:root@127.0.0.1/ormreview?charset=utf8",
encoding='utf8') Base = declarative_base(engine) class Aticle(Base):
__tablename__ = "article" #表名
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(100),nullable=False)
create_time = Column(DateTime,default=datetime.now,onupdate=datetime.now) #onupdate:更改数据,更新时间

sqlalchemy常用数据类型:

Integer:整形。

Float:浮点类型。

Boolean:传递True/False进去。

DECIMAL:定点类型。

enum:枚举类型。

Date:传递datetime.date()进去。

DateTime:传递datetime.datetime()进去。

Time:传递datetime.time()进去。

String:字符类型,使用时需要指定长度,区别于Text类型。

Text:文本类型。

LONGTEXT:长文本类型。

添加表,删除表

Column常用参数:

default:默认值。

nullable:是否可空。

primary_key:是否为主键。

unique:是否唯一。

autoincrement:是否自动增长。

onupdate:更新的时候执行的函数。

name:该属性在数据库中的字段映射。

Base.metadata.create_all()

Base.metadata.drop_all()

使用session 进行ORM操作

from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base engine = create_engine("mysql+pymysql://root:root@127.0.0.1/ormreview?charset=utf8",
encoding='utf8') session = sessionmaker(engine)() # session: <class 'sqlalchemy.orm.session.Session'> #调用sessionmaker的 __call__ 方法 , 返回使用元类创建的Session类
# type(class_.__name__, (class_,), {})

添加数据

#添加一条记录
article = Aticle(title = '鲁班来了')
session.add(article) #添加到事务中
session.commit() #添加多条记录
article1 = Aticle(title='鲁班来了1')
article2 = Aticle(title='鲁班来了2')
session.add_all([article1,article2])
session.commit()

查找

	session.query(Aticle).all()
session.query(Aticle.title).filter(Aticle.title=="鲁班来了").first()
session.query(Aticle).filter_by(title="鲁班来了1").first()
......

删除

	session.query(Aticle).first()

修改

    article =session.query(Aticle).first()
article.title = "大学英语"
session.commit()

字段类型:

    #DECIMAL 定点类型
#小数点前6位,4为小数点位数
max_price = Column(DECIMAL(10,4)) #Boolean类型
is_delete = Column(Boolean) #String类型
title = Column(String(100),nullable=False) #DateTime类型
create_time = Column(DateTime,default=datetime.now,onupdate=datetime.now) #Text类型
content = Column(Text) #Enum类型
tag = Column(Enum('美食','美女','美景'),default='美食') #Date类型
join_time = Column(DATE)
Aticle(title = '呐喊',update_time = date(2019,4,2)) #Time类型
join_time = Column(TIME)
Aticle(title = '呐喊',join_time = time(hour=21,minute=57,second=30)) #Longtext类型,只在Mysql中存在
from sqlalchemy.dialects.mysql import LONGTEXT
......

Query 可用参数。

  1. 模型对象
  2. 模型中的属性
  3. 聚合函数 (sum , avg ,min ,max , count......)
      #统计行数量
count = self.session.query(func.count(table.id)).all() #avg
avg = self.session.query(func.count(table.price)).all() #sum
sum = self.session.query(func.sum(table.price)).all() #max
max = self.session.query(func.max(table.price)).all() # 调用__getattr__魔术方法,返回本身对象_FunctionGenerator
# 调用__call__方法

过滤条件:

过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:

#equals:

query.filter(User.name == '鲁班七号')

#not equals:

query.filter(User.name != '鲁班七号')

#like:
#ilike不区分大小写 query.filter(User.name.like('%射手%')) #in: query.filter(User.name.in_(['ed','wendy','jack'])) # 同时,in也可以作用于一个Query
query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%')))) #not in: query.filter(~User.name.in_(['ed','wendy','jack'])) #is null: query.filter(User.name==None) # 或者是
query.filter(User.name.is_(None)) #is not null: query.filter(User.name != None)
# 或者是
query.filter(User.name.isnot(None)) #and:
from sqlalchemy import and_
query.filter(and_(User.name=='ed',User.fullname=='Ed Jones'))
# 或者是传递多个参数
query.filter(User.name=='ed',User.fullname=='Ed Jones')
# 或者是通过多次filter操作
query.filter(User.name=='ed').filter(User.fullname=='Ed Jones') or: from sqlalchemy import or_
query.filter(or_(User.name=='ed',User.name=='wendy'))

查找方法:

#all(): 返回全部记录的一个列表
session.query(Article).all()
# first():返回Query中的第一个值
session.query(Article).first()
#one():查找所有行作为一个结果集,如果结果集中只有一条数据,则会把这条数据提取出来,如果这个结果集少于或者多于一条数据,则会抛出异常。总结一句话:有且只有一条数据的时候才会正常的返回,否则抛出异常:
session.query(table).filter(Aticle.title=="呐喊").one()
# one_or_none():跟one()方法类似,但是在结果集中没有数据的时候也不会抛出异常。 #scalar():底层调用one()方法,并且如果one()方法没有抛出异常,会返回查询到的第一列的数据 #SQLAlchemy还提供了使用文本SQL的方式来进行查询,这种方式更加的灵活。而文本SQL要装在一个text()方法中,看以下例子: from sqlalchemy import text
for user in session.query(User).filter(text("id<244")).order_by(text("id")).all():
print user.name #如果过滤条件比如上例中的244存储在变量中,这时候就可以通过传递参数的形式进行构造: session.query(User).filter(text("id<:value and name=:name")).params(value=224,name='ed').order_by(User.id) #在文本SQL中的变量前面使用了:来区分,然后使用params方法,指定需要传入进去的参数。另外,使用from_statement方法可以把过滤的函数和条件函数都给去掉,使用纯文本的SQL: sesseion.query(User).from_statement(text("select * from users where name=:name")).params(name='ed').all() #使用from_statement方法一定要注意,from_statement返回的是一个text里面的查询语句,一定要记得调用all()方法来获取所有的值。 #values 返回generator
session.query(table).values(table.title,table.id) #value 返回一个字段
session.query(table).value(table.title) #如果想实现select count(*) from users,可以通过以下方式来实现: session.query(func.count(*)).select_from(User).scalar() #当然,如果指定了要查找的表的字段,可以省略select_from()方法: session.query(func.count(User.id)).scalar()

ORM基本操作回顾的更多相关文章

  1. python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)

    最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...

  2. sqlalchemy 的 ORM 方式使用示例

    知乎: 使用 sqlalchemy 的 orm 方式操作数据库是一种怎样的体验? 答: 酸爽! 本文基于:win10 + python3.4 + sqlAlchemy 1.0.13 先看一个图(来源) ...

  3. Django ORM models操作

    title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...

  4. ORM学习笔记

    19周 11章 django ORM基本创建类型以及生成数据库结构 类型: dbfirst :通过数据库创建类 codefirst:先创建类 再创建数据库 --最常用 ORM的意思: 通过类创建数据库 ...

  5. django 模型层(orm)05

    目录 配置测试脚本 django ORM基本操作 增删改查 Django 终端打印SQL语句 13条基本查询操作 双下滑线查询 表查询 建表 一对多字段数据的增删改查 多对多字段数据的增删改查 基于对 ...

  6. 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天)

    点击了解更多Python课程>>> 老男孩Python高级全栈开发工程师三期完整无加密带课件(共104天) 课程大纲 1.这一期比之前的Python培新课程增加了很多干货:Linux ...

  7. django之一些feature

    前端之django一些feature 本节内容 cookie session 跨站请求保护 分页 序列化 model模块 CBV和FBV 模板渲染对象 1. cookie cookie 是一种发送到客 ...

  8. 第十篇:web之前端之django一些feature

    前端之django一些feature   前端之django一些feature 本节内容 cookie session 跨站请求保护 分页 序列化 model模块 CBV和FBV 模板渲染对象 1. ...

  9. Hibernate3 第三天

    Hibernate3 第三天 第一天:三个准备.七个步骤 第二天:一级缓存.快照.多对多和一对多的配置 学习内容: Hibernate的查询详解(各种检索(fetch)对象的方式) 1)条件查询分类( ...

随机推荐

  1. 合适IT人的健身技巧

    合适IT人的健身技巧: 健身益寿生活十条 虽然遗传学家说人的平均寿命可长达120岁,但本世纪人的寿命远远达不到这个数字^有鉴于此,国外一批医生.心理学家和营养学家制定了健身益寿生活10条准则,认为如能 ...

  2. 使用Python脚本分析你的网站上的SEO元素

    撰稿马尼克斯德芒克 上2019年1月, Sooda internetbureau Python就是自动执行重复性任务,为您的其他搜索引擎优化(SEO)工作留出更多时间.没有多少SEO使用Python来 ...

  3. centos firewall使用笔记

    Centos7.x firewalld配置详解推荐文章文章地址:https://blog.csdn.net/jsonxiang/article/details/87873493 一.firewalld ...

  4. 关于信息系统设计与开发——案例:VIP系统

    一.关于信息系统设计与开发 信息系统开发流程先对需求分析系统分析,设计数据库,设计程序,再对测试数据进行测试. 在程序设计中运用了接口:定义一个接口,可以有多种实现.变量声明为接口变量,调用接口方法, ...

  5. 可遇不可求的Question之SQLSERVER触发器不支持多行插入操作篇

    描述: 我们经常遇到 insert table_a select * from table_b 这样的语句, 同时在表table_a中根据每一条新增的SQL语句,通过触发器来触发对应的一系列的后续操作 ...

  6. POJ 1067 威佐夫博弈

    点这里去看题 套公式,判断是否为奇异组合 #include<stdio.h> #include<algorithm> #include<math.h> #inclu ...

  7. Python之旅Day4 闭包函数 模块及模块倒入

    闭包函数 闭包函数就是在内部函数当中有对外部函数名字的引用 ###代码示例1### def f1(): x =1 def f2(): print(x) return f2 f=f1() f() ### ...

  8. JAVA主流框架---SSM整合

      1.通过监听器的形式引入spring 2.SpringMVC容器和Spring容器间的关系 3.汇通的主旨 让大家熟练掌握SSM调用过程.并且将后台调用彻底掌握. 4.传统项目的搭建的弊端 1.传 ...

  9. iOS 计算所有标注的经纬度范围 来确定地图显示区域

    1.计算所有点的经纬度范围 //向点聚合管理类中添加标注 _imageDataArr是存放经纬度标注数组 for (NSInteger i = 0; i < _imageDataArr.coun ...

  10. Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引

    Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大 ...