SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

1、用session做数据的增删改查操作:

  1. 构建session对象:所有和数据库的ORM操作都必须通过一个叫做session的会话对象来实现,通过以下代码来获取会话对象:

    1. from sqlalchemy.orm import sessionmaker
    2. engine = create_engine(DB_URI)
    3. session = sessionmaker(engine)()
  2. 添加对象:

    • 创建对象,也即创建一条数据:

      1. p = Person(name='zhangsan',age=18,country='china')
    • 将这个对象添加到session会话对象中:

      1. session.add(p)
    • 将session中的对象做commit操作(提交):

      1. session.commit()
    • 一次性添加多条数据:

      1. p1 = Person(name='zhangsan',age=19,country='china')
      2. p2 = Person(name='lisi',age=20,country='china')
      3. session.add_all([p1,p2])
      4. session.commit()
  3. 查找对象:

    1. # 查找某个模型对应的那个表中所有的数据:
    2. all_person = session.query(Person).all()
    3. # 使用filter_by来做条件查询
    4. all_person = session.query(Person).filter_by(name='zhangsan').all()
    5. # 使用filter来做条件查询
    6. all_person = session.query(Person).filter(Person.name=='zhangsan').all()
    7. # 使用get方法查找数据,get方法是根据id来查找的,只会返回一条数据或者None
    8. person = session.query(Person).get(primary_key)
    9. # 使用first方法获取结果集中的第一条数据
    10. person = session.query(Person).first()
  4. 修改对象:首先从数据库中查找对象,然后将这条数据修改为你想要的数据,最后做commit操作就可以修改数据了。

    1. person = session.query(Person).first()
    2. person.name = 'wangwu'
    3. session.commit()
  5. 删除对象:将需要删除的数据从数据库中查找出来,然后使用session.delete方法将这条数据从session中删除,最后做commit操作就可以了。

    1. person = session.query(Person).first()
    2. session.delete(person)
    3. session.commit()

2、SQLAlchemy常用数据类型:

  1. Integer:整形,映射到数据库中是int类型。

  2. Float:浮点类型,映射到数据库中是float类型。他占据的32位。

  3. Double:双精度浮点类型,映射到数据库中是double类型,占据64位。

  4. String:可变字符类型,映射到数据库中是varchar类型.

  5. Boolean:布尔类型,映射到数据库中的是tinyint类型。

  6. DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。

  7. Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举,示例代码如下:

    1. class Article(Base):
    2. __tablename__ = 'article'
    3. id = Column(Integer,primary_key=True,autoincrement=True)
    4. tag = Column(Enum("python",'flask','django'))

    在Python3中,已经内置了enum这个枚举的模块,我们也可以使用这个模块去定义相关的字段。示例代码如下:

    1. class TagEnum(enum.Enum):
    2. python = "python"
    3. flask = "flask"
    4. django = "django"
    5. class Article(Base):
    6. __tablename__ = 'article'
    7. id = Column(Integer,primary_key=True,autoincrement=True)
    8. tag = Column(Enum(TagEnum))
    9. article = Article(tag=TagEnum.flask)
  8. Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用datetime.date来指定。示例代码如下:

    1. class Article(Base):
    2. __tablename__ = 'article'
    3. id = Column(Integer,primary_key=True,autoincrement=True)
    4. create_time = Column(Date)
    5. article = Article(create_time=date(2017,10,10))
  9. DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用datetime.datetime来指定。示例代码如下:

    1. class Article(Base):
    2. __tablename__ = 'article'
    3. id = Column(Integer,primary_key=True,autoincrement=True)
    4. create_time = Column(DateTime)
    5. article = Article(create_time=datetime(2011,11,11,11,11,11))
  10. Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用datetime.time来至此那个。示例代码如下:

    1. class Article(Base):
    2. __tablename__ = 'article'
    3. id = Column(Integer,primary_key=True,autoincrement=True)
    4. create_time = Column(Time)
    5. article = Article(create_time=time(hour=11,minute=11,second=11))
  11. Text:存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型。

  12. LONGTEXT:长文本类型,映射到数据库中是longtext类型。

  • 示例代码:

    1. #encoding: utf-8
    2. from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text
    3. from sqlalchemy.dialects.mysql import LONGTEXT
    4. from sqlalchemy.ext.declarative import declarative_base
    5. from sqlalchemy.orm import sessionmaker
    6. import enum # 在Python3中才有这个enum模块,在python2中没有
    7. HOSTNAME = '127.0.0.1'
    8. PORT = '3306'
    9. DATABASE = 'first_sqlalchemy'
    10. USERNAME = 'root'
    11. PASSWORD = 'root'
    12. # dialect+driver://username:password@host:port/database
    13. DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
    14. engine = create_engine(DB_URI)
    15. Base = declarative_base(engine)
    16. session = sessionmaker(engine)()
    17. class TagEnum(enum.Enum):
    18. python = "python"
    19. flask = "flask"
    20. django = "django"
    21. class Article(Base):
    22. __tablename__ = 'article'
    23. id = Column(Integer,primary_key=True,autoincrement=True)
    24. rice = Column(Float)
    25. is_delete = Column(Boolean)
    26. price = Column(DECIMAL(10,4)) # 100000.0001
    27. # Enum方式一:
    28. tag = Column(Enum('python','flask','django'))
    29. # Enum方式二:
    30. tag = Column(Enum(TagEnum))
    31. create_time = Column(Date)
    32. # create_time = Column(DateTime)
    33. # create_time = Column(Time)
    34. title = Column(String(50))
    35. content = Column(Text)
    36. # content = Column(LONGTEXT)
    37. Base.metadata.drop_all()
    38. Base.metadata.create_all()
    39. from datetime import date
    40. from datetime import datetime
    41. from datetime import time
    42. article = Article(price=100000.99999) # 小数点位数超出会报错
    43. session.add(article)
    44. session.commit()

3、Column常用参数:

  1. primary_key:设置某个字段为主键。

  2. autoincrement:设置这个字段为自动增长的。

  3. default:设置某个字段的默认值。在发表时间这些字段上面经常用。

  4. nullable:指定某个字段是否为空。默认值是True,就是可以为空。

  5. unique:指定某个字段的值是否唯一。默认是False。

  6. onupdate:在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用的就是update_time(每次更新数据的时候都要更新的值)。

  7. name:指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为参数。这个参数也可以当作位置参数,在第1个参数来指定。

    1. title = Column(String(50),name='title',nullable=False)
    2. title = Column('my_title',String(50),nullable=False)
  • 示例代码:

    1. #encoding: utf-8
    2. from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text
    3. from sqlalchemy.dialects.mysql import LONGTEXT
    4. from sqlalchemy.ext.declarative import declarative_base
    5. from sqlalchemy.orm import sessionmaker
    6. from datetime import datetime
    7. HOSTNAME = '127.0.0.1'
    8. PORT = '3306'
    9. DATABASE = 'first_sqlalchemy'
    10. USERNAME = 'root'
    11. PASSWORD = 'root'
    12. # dialect+driver://username:password@host:port/database
    13. DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
    14. engine = create_engine(DB_URI)
    15. Base = declarative_base(engine)
    16. session = sessionmaker(engine)()
    17. class Article(Base):
    18. __tablename__ = 'article'
    19. id = Column(Integer,primary_key=True,autoincrement=True)
    20. create_time = Column(DateTime,default=datetime.now)
    21. read_count = Column(Integer,default=11)
    22. title = Column(String(50),name='my_title',nullable=False)
    23. telephone = Column(String(11),unique=True)
    24. update_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)
    25. Base.metadata.create_all()

4、query可用参数:

  1. 模型对象:指定查找这个模型中所有的对象。
  2. 模型中的属性:可以指定只查找某个模型的其中几个属性。
  3. 聚合函数:
    • func.count:统计行的数量。
    • func.avg:求平均值。
    • func.max:求最大值。
    • func.min:求最小值。
    • func.sum:求和。

      func上,其实没有任何聚合函数。但是因为他底层做了一些魔术,只要mysql中有的聚合函数,都可以通过func调用。
  • 示例代码:

    1. #encoding: utf-8
    2. from sqlalchemy import create_engine,Column,Integer,Float,Boolean,DECIMAL,Enum,Date,DateTime,Time,String,Text,func
    3. from sqlalchemy.dialects.mysql import LONGTEXT
    4. from sqlalchemy.ext.declarative import declarative_base
    5. from sqlalchemy.orm import sessionmaker
    6. # 在Python3中才有这个enum模块,在python2中没有
    7. import enum
    8. from datetime import datetime
    9. import random
    10. HOSTNAME = '127.0.0.1'
    11. PORT = '3306'
    12. DATABASE = 'first_sqlalchemy'
    13. USERNAME = 'root'
    14. PASSWORD = 'root'
    15. # dialect+driver://username:password@host:port/database
    16. DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
    17. engine = create_engine(DB_URI)
    18. Base = declarative_base(engine)
    19. session = sessionmaker(engine)()
    20. class Article(Base):
    21. __tablename__ = 'article'
    22. id = Column(Integer,primary_key=True,autoincrement=True)
    23. title = Column(String(50),nullable=False)
    24. price = Column(Float,nullable=False)
    25. def __repr__(self):
    26. return "<Article(title:%s)>" % self.title
    27. # 创建一些测试数据
    28. Base.metadata.drop_all()
    29. Base.metadata.create_all()
    30. for x in range(6):
    31. article = Article(title='title%s'%x,price=random.randint(50,100))
    32. session.add(article)
    33. session.commit()
    34. # 模型对象
    35. articles = session.query(Article).all()
    36. print(articles)
    37. # 模型中的属性
    38. articles = session.query(Article.title,Article.price).all()
    39. print(articles)
    40. # 聚合函数
    41. # count
    42. result = session.query(func.count(Article.id)).first()
    43. print(result)
    44. # avg
    45. result = session.query(func.avg(Article.price)).first()
    46. print(result)
    47. # max
    48. result = session.query(func.max(Article.price)).first()
    49. print(result)
    50. # min
    51. result = session.query(func.min(Article.price)).first()
    52. print(result)
    53. # sum
    54. result = session.query(func.sum(Article.price)).first()
    55. print(result)
    56. # print(func.sum(Article.price))
    57. # select sum(price) from article;

5、filter过滤条件:

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

  1. equals:

    1. article = session.query(Article).filter(Article.title == "title0").first()
    2. print(article)
  2. not equals:

    1. query.filter(User.name != 'ed')
  3. like:

    1. query.filter(User.name.like('%ed%'))
  4. in:

    1. query.filter(User.name.in_(['ed','wendy','jack']))
    2. # 同时,in也可以作用于一个Query
    3. query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))
  5. not in:

    1. query.filter(~User.name.in_(['ed','wendy','jack']))
  6. is null:

    1. # 方式一:
    2. query.filter(User.name==None)
    3. # 方式二:
    4. query.filter(User.name.is_(None))
  7. is not null:

    1. # 方式一:
    2. query.filter(User.name != None)
    3. # 方式二:
    4. query.filter(User.name.isnot(None))
  8. and:

    1. from sqlalchemy import and_
    2. query.filter(and_(User.name=='ed',User.fullname=='Ed Jones'))
    3. # 或者是传递多个参数
    4. query.filter(User.name=='ed',User.fullname=='Ed Jones')
    5. # 或者是通过多次filter操作
    6. query.filter(User.name=='ed').filter(User.fullname=='Ed Jones')
  9. or:

    1. from sqlalchemy import or_
    2. query.filter(or_(User.name=='ed',User.name=='wendy'))
  10. 如果想要查看orm底层转换的sql语句,可以在filter方法后面不要再执行任何方法直接打印就可以看到了。比如:

    1. articles = session.query(Article).filter(or_(Article.title=='abc',Article.content=='abc'))
    2. print(articles)

SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解的更多相关文章

  1. SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解

    SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...

  2. Python教程:连接数据库,对数据进行增删改查操作

    各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...

  3. 封装MySQL的单例,连接数据库并对数据进行增删改查操作

    单例: 一个类只能有一个对象 应用场景:多次请求数据库只需要一个连接对象. 实现:三私一公 1.私有的静态属性用来保存对象的单例2.私有的构造方法用来阻止在类的外部实例化3.私有的__clone阻止在 ...

  4. 控制台程序实现利用CRM组织服务和SqlConnection对数据库中数据的增删改查操作

    一.首先新建一个控制台程序.命名为TestCol. 二.打开App.config在里面加入,数据库和CRM连接字符串 <connectionStrings> <add name=&q ...

  5. EF5 通用数据层 增删改查操作,泛型类(转)

    using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using Syste ...

  6. EF5 通用数据层 增删改查操作,泛型类

    using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using Syste ...

  7. 详谈easyui datagrid增删改查操作

    转自:http://blog.csdn.net/abauch_d/article/details/7734395 前几天我把easyui dadtagrid的增删改查的实现代码贴了出来,发现访问量达到 ...

  8. 浅谈dataGridView使用,以及画面布局使用属性,对datagridview进行增删改查操作,以及委托使用技巧

        通过几天的努力后,对datagridview使用作一些简要的介绍,该实例主要运用与通过对datagridview操作.对数据进行增删改查操作时,进行逻辑判断执行相关操作.简单的使用委托功能,实 ...

  9. jdbc 数据的增删改查的Statement Resultset PreparedStatement

    完成数据库的连接,就马上要对数据库进行增删改查操作了:先来了解一下Statement 通过JDBC插入数据 (这里提供一个查找和插入方法) Statement:用于执行sql语句的对象: *1.通过C ...

随机推荐

  1. Nice Jquery Validator 方法

    .validator() .validator( options ) 描述:根据参数初始化验证,验证 jQuery 选中的表单 参数:{Object} options - 可选,参考配置选项 示例: ...

  2. Python多线程 - threading

    目录 1. GIL 2. API 3. 创建子线程 4. 线程同步 4.1. 有了GIL,是否还需要同步? 4.1.1. 死锁 4.1.2. 竞争条件 4.1.3. GIL去哪儿了 4.2. Lock ...

  3. (六)POI-操作Excel的poi的字体设置

    原文链接:https://blog.csdn.net/class157/article/details/92817286 package com.java.poi; import org.apache ...

  4. 深入理解 EF Core:EF Core 读取数据时发生了什么?

    阅读本文大概需要 11 分钟. 原文:https://bit.ly/2UMiDLb 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...

  5. 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题

    一:背景 1. 讲故事 在开始本文之前,真的好想做个问卷调查,到底有多少人和我一样,对 JsonConvert 的认识只局限在 SerializeObject 和 DeserializeObject ...

  6. 找到了两个联想的OEM XP镜像文件

    今天在收拾移动硬盘的时候发现了两个XP镜像 还都是联想的,一个有OOBE,另一个无OOBE,全传网盘里了,需要的自取 有个疑问 2020年还有多少家庭电脑和ATM机器还在用XP??? link:htt ...

  7. 3.WebPack配置文件

    一.为什么需要WebPack配置文件 引用自官方: 在 webpack 4 中,可以无须任何配置使用,然而大多数项目会需要很复杂的设置,这就是为什么 webpack 仍然要支持 配置文件.这比在终端( ...

  8. 挖洞入门_显错型SQL注入

    简介:在漏洞盒子挖洞已经有一段时间了,虽说还不是大佬,但技术也有所进步,安全行业就是这样,只有自己动手去做,才能将理论的知识变为个人的经验.本篇文章打算分享一下我在挖显错型SQL注入漏洞过程中的一些个 ...

  9. Linux系统结构详解(转)

    Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图1-1所 ...

  10. eclipse clone克隆github远程库工程到本地

    项目作者把项目push到github远程库,其他用户可以把项目克隆到本地: eclipse里的操作具体如下: File -> Import... 找到Git 选择 Project from Gi ...