SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
1、用session做数据的增删改查操作:
构建session对象:所有和数据库的ORM操作都必须通过一个叫做
session
的会话对象来实现,通过以下代码来获取会话对象:- from sqlalchemy.orm import sessionmaker
- engine = create_engine(DB_URI)
- session = sessionmaker(engine)()
添加对象:
创建对象,也即创建一条数据:
p = Person(name='zhangsan',age=18,country='china')
将这个对象添加到
session
会话对象中:session.add(p)
将session中的对象做commit操作(提交):
session.commit()
一次性添加多条数据:
p1 = Person(name='zhangsan',age=19,country='china')
p2 = Person(name='lisi',age=20,country='china')
session.add_all([p1,p2])
session.commit()
查找对象:
# 查找某个模型对应的那个表中所有的数据:
all_person = session.query(Person).all()
# 使用filter_by来做条件查询
all_person = session.query(Person).filter_by(name='zhangsan').all()
# 使用filter来做条件查询
all_person = session.query(Person).filter(Person.name=='zhangsan').all()
# 使用get方法查找数据,get方法是根据id来查找的,只会返回一条数据或者None
person = session.query(Person).get(primary_key)
# 使用first方法获取结果集中的第一条数据
person = session.query(Person).first()
修改对象:首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了。
person = session.query(Person).first()
person.name = 'wangwu'
session.commit()
删除对象:将需要删除的数据从数据库中查找出来,然后使用
session.delete
方法将这条数据从session中删除,最后做commit操作就可以了。person = session.query(Person).first()
session.delete(person)
session.commit()
2、SQLAlchemy常用数据类型:
Integer:整形,映射到数据库中是int类型。
Float:浮点类型,映射到数据库中是float类型。他占据的32位。
Double:双精度浮点类型,映射到数据库中是double类型,占据64位。
String:可变字符类型,映射到数据库中是varchar类型.
Boolean:布尔类型,映射到数据库中的是tinyint类型。
DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举,示例代码如下:
- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- tag = Column(Enum("python",'flask','django'))
在Python3中,已经内置了enum这个枚举的模块,我们也可以使用这个模块去定义相关的字段。示例代码如下:
- class TagEnum(enum.Enum):
- python = "python"
- flask = "flask"
- django = "django"
- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- tag = Column(Enum(TagEnum))
- article = Article(tag=TagEnum.flask)
- class Article(Base):
Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用
datetime.date
来指定。示例代码如下:- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- create_time = Column(Date)
- article = Article(create_time=date(2017,10,10))
- class Article(Base):
DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用
datetime.datetime
来指定。示例代码如下:- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- create_time = Column(DateTime)
- article = Article(create_time=datetime(2011,11,11,11,11,11))
- class Article(Base):
Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用
datetime.time
来至此那个。示例代码如下:- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- create_time = Column(Time)
- article = Article(create_time=time(hour=11,minute=11,second=11))
- class Article(Base):
Text:存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型。
LONGTEXT:长文本类型,映射到数据库中是longtext类型。
示例代码:
- #encoding: utf-8
- from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text
- from sqlalchemy.dialects.mysql import LONGTEXT
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import sessionmaker
- import enum # 在Python3中才有这个enum模块,在python2中没有
- HOSTNAME = '127.0.0.1'
- PORT = ''
- DATABASE = 'first_sqlalchemy'
- USERNAME = 'root'
- PASSWORD = 'root'
- # dialect+driver://username:password@host:port/database
- DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
- engine = create_engine(DB_URI)
- Base = declarative_base(engine)
- session = sessionmaker(engine)()
- class TagEnum(enum.Enum):
- python = "python"
- flask = "flask"
- django = "django"
- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- rice = Column(Float)
- is_delete = Column(Boolean)
- price = Column(DECIMAL(10,4)) # 100000.0001
- # Enum方式一:
- tag = Column(Enum('python','flask','django'))
- # Enum方式二:
- tag = Column(Enum(TagEnum))
- create_time = Column(Date)
- # create_time = Column(DateTime)
- # create_time = Column(Time)
- title = Column(String(50))
- content = Column(Text)
- # content = Column(LONGTEXT)
- Base.metadata.drop_all()
- Base.metadata.create_all()
- from datetime import date
- from datetime import datetime
- from datetime import time
- article = Article(price=100000.99999) # 小数点位数超出会报错
- session.add(article)
- session.commit()
3、Column常用参数:
primary_key:设置某个字段为主键。
autoincrement:设置这个字段为自动增长的。
default:设置某个字段的默认值。在发表时间这些字段上面经常用。
nullable:指定某个字段是否为空。默认值是True,就是可以为空。
unique:指定某个字段的值是否唯一。默认是False。
onupdate:在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用的就是
update_time
(每次更新数据的时候都要更新的值)。name:指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为参数。这个参数也可以当作位置参数,在第1个参数来指定。
title = Column(String(50),name='title',nullable=False)
title = Column('my_title',String(50),nullable=False)
示例代码:
- #encoding: utf-8
- from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text
- from sqlalchemy.dialects.mysql import LONGTEXT
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import sessionmaker
- from datetime import datetime
- HOSTNAME = '127.0.0.1'
- PORT = ''
- DATABASE = 'first_sqlalchemy'
- USERNAME = 'root'
- PASSWORD = 'root'
- # dialect+driver://username:password@host:port/database
- DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
- engine = create_engine(DB_URI)
- Base = declarative_base(engine)
- session = sessionmaker(engine)()
- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- create_time = Column(DateTime,default=datetime.now)
- read_count = Column(Integer,default=11)
- title = Column(String(50),name='my_title',nullable=False)
- telephone = Column(String(11),unique=True)
- update_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)
- Base.metadata.create_all()
4、query可用参数:
- 模型对象:指定查找这个模型中所有的对象。
- 模型中的属性:可以指定只查找某个模型的其中几个属性。
- 聚合函数:
- func.count:统计行的数量。
- func.avg:求平均值。
- func.max:求最大值。
- func.min:求最小值。
- func.sum:求和。
func
上,其实没有任何聚合函数。但是因为他底层做了一些魔术,只要mysql中有的聚合函数,都可以通过func调用。
示例代码:
- #encoding: utf-8
- from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func
- from sqlalchemy.dialects.mysql import LONGTEXT
- from sqlalchemy.ext.declarative import declarative_base
- from sqlalchemy.orm import sessionmaker
- # 在Python3中才有这个enum模块,在python2中没有
- import enum
- from datetime import datetime
- import random
- HOSTNAME = '127.0.0.1'
- PORT = ''
- DATABASE = 'first_sqlalchemy'
- USERNAME = 'root'
- PASSWORD = 'root'
- # dialect+driver://username:password@host:port/database
- DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
- engine = create_engine(DB_URI)
- Base = declarative_base(engine)
- session = sessionmaker(engine)()
- class Article(Base):
- __tablename__ = 'article'
- id = Column(Integer,primary_key=True,autoincrement=True)
- title = Column(String(50),nullable=False)
- price = Column(Float,nullable=False)
- def __repr__(self):
- return "<Article(title:%s)>" % self.title
- # 创建一些测试数据
- Base.metadata.drop_all()
- Base.metadata.create_all()
- for x in range(6):
- article = Article(title='title%s'%x,price=random.randint(50,100))
- session.add(article)
- session.commit()
- # 模型对象
- articles = session.query(Article).all()
- print(articles)
- # 模型中的属性
- articles = session.query(Article.title,Article.price).all()
- print(articles)
- # 聚合函数
- # count
- result = session.query(func.count(Article.id)).first()
- print(result)
- # avg
- result = session.query(func.avg(Article.price)).first()
- print(result)
- # max
- result = session.query(func.max(Article.price)).first()
- print(result)
- # min
- result = session.query(func.min(Article.price)).first()
- print(result)
- # sum
- result = session.query(func.sum(Article.price)).first()
- print(result)
- # print(func.sum(Article.price))
- # select sum(price) from article;
5、filter过滤条件:
过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现
equals:
article = session.query(Article).filter(Article.title == "title0").first()
print(article)
not equals:
query.filter(User.name != 'ed')
like:
query.filter(User.name.like('%ed%'))
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'))
如果想要查看orm底层转换的sql语句,可以在filter方法后面不要再执行任何方法直接打印就可以看到了。比如:
articles = session.query(Article).filter(or_(Article.title=='abc',Article.content=='abc'))
print(articles)
SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解的更多相关文章
- SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
- Python教程:连接数据库,对数据进行增删改查操作
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...
- 封装MySQL的单例,连接数据库并对数据进行增删改查操作
单例: 一个类只能有一个对象 应用场景:多次请求数据库只需要一个连接对象. 实现:三私一公 1.私有的静态属性用来保存对象的单例2.私有的构造方法用来阻止在类的外部实例化3.私有的__clone阻止在 ...
- 控制台程序实现利用CRM组织服务和SqlConnection对数据库中数据的增删改查操作
一.首先新建一个控制台程序.命名为TestCol. 二.打开App.config在里面加入,数据库和CRM连接字符串 <connectionStrings> <add name=&q ...
- EF5 通用数据层 增删改查操作,泛型类(转)
using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using Syste ...
- EF5 通用数据层 增删改查操作,泛型类
using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using Syste ...
- 详谈easyui datagrid增删改查操作
转自:http://blog.csdn.net/abauch_d/article/details/7734395 前几天我把easyui dadtagrid的增删改查的实现代码贴了出来,发现访问量达到 ...
- 浅谈dataGridView使用,以及画面布局使用属性,对datagridview进行增删改查操作,以及委托使用技巧
通过几天的努力后,对datagridview使用作一些简要的介绍,该实例主要运用与通过对datagridview操作.对数据进行增删改查操作时,进行逻辑判断执行相关操作.简单的使用委托功能,实 ...
- Mybatis学习总结(二)—使用接口实现数据的增删改查
在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...
随机推荐
- @uoj - 164@ 【清华集训2015】V
目录 @description@ @solution@ @accepted code@ @details@ @description@ Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化 ...
- @loj - 2987@ 「CTSC2016」时空旅行
目录 @description@ @solution@ @accepted code@ @details@ @description@ 2045 年,人类的技术突飞猛进,已经找到了进行时空旅行的方法. ...
- 深入理解 EF Core:EF Core 读取数据时发生了什么?
阅读本文大概需要 11 分钟. 原文:https://bit.ly/2UMiDLb 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...
- cb03a_c++_数据结构_顺序容器_STL_stack
/*cb03a_c++_数据结构_顺序容器_STL_stack堆栈:LIFO--Last In First Out后进先出,用于系统程序设计自适应容器(容器适配器),不是独立的容器,是一个适配器栈适配 ...
- cookie的介绍和使用
一.什么是cookie 是由服务器端生成,发送给客户端(一般指浏览器),浏览器将cookie以键值对的形式保存到某个目录下的文本文件内.下次请求该网站时就把cookie发送回服务器.(cookie就是 ...
- linuxshell编程之环境变量配置文件 Tony Linux系统工程师
视频参考慕课网 如果修改了环境变量的配置文件,要使得修改的环境变量生效可以使用下面的两个命令 下面是点后面加上了一个空格然后再加上配置文件,这里一定要注意下 这里要注意和隐藏文件的区别: 在linux ...
- ECSHOP后台左侧添加菜单栏
比如我们在后台中增加 “活动管理”功能,方法如下 在ECSHOP 管理中心共用语言文件 language\zh_cn\admin\commn.php ,添加我们的自定义菜单: $_LANG['17_a ...
- java命令行输入参数
Java命令行输入参数 代码用例:命令行输入参数,并进行加法运算. public class Demo01 { public static void main(String[] args) { for ...
- nova api报错network问题
安装openstack Rocky版本的时候,在未安装网络服务前,创建虚拟机,报以下错误 [root@controller2 nova]# openstack server create --flav ...
- app自动化测试环境配置:adb环境配置、monkey环境配置、appium环境配置大全
1. 安装jdk 2. 安装配置Andriod sdk 安装Andriod sdk前首先需要安装配置好jdk环境. 然后安装Android sdk 安装完成后需要配置环境变量:ANDROID_HOME ...