pymysqlpymysql是用Python来操作mysql的包,因此通过pip来安装,命令如下:pip3 install pymysql。如果您用的是Python 3,请安装pymysql

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

SQLAlchemySQLAlchemy是一个数据库的ORM框架,我们在后面会用到。安装命令为:pip3 install SQLAlchemy

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

  1. #encoding:utf-8
  2. # __author__ = 'donghao'
  3. # __time__ = 2019/1/4 17:07
  4. from sqlalchemy import create_engine
  5. #数据库配置变量
  6. HOSTNAME = '127.0.0.1'
  7. PORT = '3306'
  8. DATABASE = 'firstsqlalchemy'
  9. USERNAME = 'root'
  10. PASSWORD = 'root'
  11. DB_URL = "mysql+pymysql://{}:{}@{}/{}".format(USERNAME,PASSWORD,HOSTNAME,DATABASE)
  12. # 创建引擎
  13. engine = create_engine(DB_URL,encoding='utf8')
  14. #创建连接
  15. with engine.connect() as con:
  16. rs = con.execute('SELECT 1')
  17. print rs.fetchone()

首先从sqlalchemy中导入create_engine,用这个函数来创建引擎,然后用engine.connect()来连接数据库。其中一个比较重要的一点是,通过create_engine函数的时候,需要传递一个满足某种格式的字符串,对这个字符串的格式来进行解释:

  1. dialect+driver://username:password@host:port/database?charset=utf8

dialect是数据库的实现,比如MySQLPostgreSQLSQLite,并且转换成小写。driverPython对应的驱动,如果不指定,会选择默认的驱动,比如MySQL的默认驱动是MySQLdbusername是连接数据库的用户名,password是连接数据库的密码,host是连接数据库的域名,port是数据库监听的端口号,database是连接哪个数据库的名字。

如果以上输出了1,说明SQLAlchemy能成功连接到数据库。

用SQLAlchemy执行原生SQL:

我们将上一个例子中的数据库配置选项单独放在一个constants.py的文件中,看以下例子:

  1. from sqlalchemy import create_engine
  2. from constants import DB_URI
  3. #连接数据库
  4. engine = create_engine(DB_URI,echo=True)
  5. # 使用with语句连接数据库,如果发生异常会被捕获
  6. with engine.connect() as con:
  7. # 先删除users表
  8. con.execute('drop table if exists authors')
  9. # 创建一个users表,有自增长的id和name
  10. con.execute('create table authors(id int primary key auto_increment,'name varchar(25))')
  11. # 插入两条数据到表中
  12. con.execute('insert into persons(name) values("abc")')
  13. con.execute('insert into persons(name) values("xiaotuo")')
  14. # 执行查询操作
  15. results = con.execute('select * from persons')
  16. # 从查找的结果中遍历
  17. for result in results:
  18. print(result)

SQLAlchemy

使用SQLAlchemy:

要使用ORM来操作数据库,首先需要创建一个类来与对应的表进行映射

  1. from sqlalchemy import Column,Integer,String
  2. from constants import DB_URI
  3. from sqlalchemy import create_engine
  4. from sqlalchemy.ext.declarative import declarative_base
  5. engine = create_engine(DB_URI,echo=True)
  6. # 所有的类都要继承自`declarative_base`这个函数生成的基类
  7. Base = declarative_base(engine)
  8. class User(Base):
  9. # 定义表名为users
  10. __tablename__ = 'users'
  11. # 将id设置为主键,并且默认是自增长的
  12. id = Column(Integer,primary_key=True)
  13. # name字段,字符类型,最大的长度是50个字符
  14. name = Column(String(50))
  15. fullname = Column(String(50))
  16. password = Column(String(100))
  17. # 让打印出来的数据更好看,可选的
  18. def __repr__(self):
  19. return "<User(id='%s',name='%s',fullname='%s',password='%s')>" % (self.id,self.name,self.fullname,self.password

SQLAlchemy会自动的设置第一个Integer的主键并且没有被标记为外键的字段添加自增长的属性。因此以上例子中id自动的变成自增长的。以上创建完和表映射的类后,还没有真正的映射到数据库当中,执行以下代码将类映射到数据库中:

  1. Base.metadata.create_all()

增删改查

增:

  1. # 1.增加
  2. def add_func():
  3. p = Person(username='donghao')
  4. session.add(p)
  5. session.commit()

查:

  1. def check():
  2. Persons = session.query(Person).all()
  3. for person in Persons:
  4. print(person.username)

删:

  1. def delete():
  2. Persons = session.query(Person).first()
  3. session.delete(Persons)
  4. session.commit()

改:

  1. def edit():
  2. Persons = session.query(Person).first()
  3. Persons.username = '123

SQLAlchemy的ORM(2)

Column常用参数:

  • default:默认值。
  • nullable:是否可空。
  • primary_key:是否为主键。
  • unique:是否唯一。
  • autoincrement:是否自动增长。
  • onupdate:更新的时候执行的函数。
  • name:该属性在数据库中的字段映射。

sqlalchemy常用数据类型:

  • Integer:整形。
  • Float:浮点类型。
  • Boolean:传递True/False进去。
  • DECIMAL:定点类型。
  • enum:枚举类型。
  • Date:传递datetime.date()进去。
  • DateTime:传递datetime.datetime()进去。
  • Time:传递datetime.time()进去。
  • String:字符类型,使用时需要指定长度,区别于Text类型。
  • Text:文本类型。
  • LONGTEXT:长文本类型。

query可用参数:

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

过滤条件:

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

  1. equals

    1. query.filter(User.name == 'ed')
  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. query.filter(User.name==None)
    2. # 或者是
    3. query.filter(User.name.is_(None))
  7. is not null:

    1. query.filter(User.name != None)
    2. # 或者是
    3. 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_ query.filter(or_(User.name=='ed',User.name=='wendy'))

SQLAlchemy的ORM(3)

查找方法:

介绍完过滤条件后,有一些经常用到的查找数据的方法也需要解释一下:

  1. all():返回一个Python列表(list):

    1. query = session.query(User).filter(User.name.like('%ed%').order_by(User.id)
    2. # 输出query的类型
    3. print type(query)
    4. > <type 'list'>
    5. # 调用all方法
    6. query = query.all()
    7. # 输出query的类型
    8. print type(query)
    9. > <class 'sqlalchemy.orm.query.Query'>
  2. first():返回Query中的第一个值:

    1. user = session.query(User).first()
    2. print user
    3. > <User(name='ed', fullname='Ed Jones', password='f8s7ccs')>
  3. one():查找所有行作为一个结果集,如果结果集中只有一条数据,则会把这条数据提取出来,如果这个结果集少于或者多于一条数据,则会抛出异常。总结一句话:有且只有一条数据的时候才会正常的返回,否则抛出异常:

    1. # 多于一条数据
    2. user = query.one()
    3. > Traceback (most recent call last):
    4. > ...
    5. > MultipleResultsFound: Multiple rows were found for one()
    6. # 少于一条数据
    7. user = query.filter(User.id == 99).one()
    8. > Traceback (most recent call last):
    9. > ...
    10. > NoResultFound: No row was found for one()
    11. # 只有一条数据
    12. > query(User).filter_by(name='ed').one()
  4. one_or_none():跟one()方法类似,但是在结果集中没有数据的时候也不会抛出异常。

  5. scalar():底层调用one()方法,并且如果one()方法没有抛出异常,会返回查询到的第一列的数据:

    1. session.query(User.name,User.fullname).filter_by(name='ed').scalar()

文本SQL:

SQLAlchemy还提供了使用文本SQL的方式来进行查询,这种方式更加的灵活。而文本SQL要装在一个text()方法中,看以下例子:

  1. from sqlalchemy import text
  2. for user in session.query(User).filter(text("id<244")).order_by(text("id")).all():
  3. print user.name

如果过滤条件比如上例中的244存储在变量中,这时候就可以通过传递参数的形式进行构造:

  1. session.query(User).filter(text("id<:value and name=:name")).params(value=224,name='ed').order_by(User.id)

在文本SQL中的变量前面使用了:来区分,然后使用params方法,指定需要传入进去的参数。另外,使用from_statement方法可以把过滤的函数和条件函数都给去掉,使用纯文本的SQL:

  1. sesseion.query(User).from_statement(text("select * from users where name=:name")).params(name='ed').all()

使用from_statement方法一定要注意,from_statement返回的是一个text里面的查询语句,一定要记得调用all()方法来获取所有的值。

计数(Count):

Query对象有一个非常方便的方法来计算里面装了多少数据:

  1. session.query(User).filter(User.name.like('%ed%')).count()

当然,有时候你想明确的计数,比如要统计users表中有多少个不同的姓名,那么简单粗暴的采用以上count是不行的,因为姓名有可能会重复,但是处于两条不同的数据上,如果在原生数据库中,可以使用distinct关键字,那么在SQLAlchemy中,可以通过func.count()方法来实现:

  1. from sqlalchemy import func
  2. session.query(func.count(User.name),User.name).group_by(User.name).all()
  3. # 输出的结果
  4. > [(1, u'ed'), (1, u'fred'), (1, u'mary'), (1, u'wendy')]

另外,如果想实现select count(*) from users,可以通过以下方式来实现:

  1. session.query(func.count(*)).select_from(User).scalar()

当然,如果指定了要查找的表的字段,可以省略select_from()方法:

  1. session.query(func.count(User.id)).scalar()

SQLAlchemy介绍和基本使用的更多相关文章

  1. SQLAlchemy介绍

    SQLAlchemy 增删改查 一对多 多对多   Python 的 ORM 框架 SQLAlchemy 有些同学已经听说过这个框架的大名了,也听说了 SQLAlchemy 没有 Django 的 M ...

  2. sqlalchemy模块介绍、单表操作、一对多表操作、多对多表操作、flask集成.

    今日内容概要 sqlalchemy介绍和快速使用 单表操作增删查改 一对多 多对多 flask集成 内容详细 1.sqlalchemy介绍和快速使用 # SQLAlchemy是一个基于 Python实 ...

  3. SQLAlchemy表操作和增删改查

    一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...

  4. python 全栈开发,Day141(flask之应用上下文,SQLAlchemy)

    一.flask之应用上下文 由于时间关系,详细过程略... 草稿图 参考链接: http://www.cnblogs.com/zhaopanpan/p/9457343.html 总结: 上下文管理(应 ...

  5. Python中操作SQLAlchemy

    一.ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 ...

  6. python3之SQLAlchemy

    1.SQLAlchemy介绍 SQLAlchemy是Python SQL工具包和对象关系映射器,为应用程序开发人员提供了SQL的全部功能和灵活性. 它提供了一整套众所周知的企业级持久性模式,专为高效和 ...

  7. SQLAlchemy基本使用(Flask中)

    SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架. 该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据 ...

  8. SQLAlchemy(3)

    一. SQLAlchemy 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使 ...

  9. SQLAlchemy技术手册

    一.ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 ...

随机推荐

  1. Transforming Real-Time Task Graphs to Improve Schedulability

    Basic idea:  insert artificial delays to the release times of certain vertices of a task graph to ge ...

  2. 将批量指定的docker镜像打成文件

      #/bin/bash tag= img1=hub.chinacloud.com.cn/onex.dev/one-task-scheduler:$tag img2=hub.chinacloud.co ...

  3. s5-1 网络层引言

    网络层要做什么? 源和目的之间的网络有哪些类? 数据报网络  提供无连接的服务 虚电路网络  提供面向连接的服务  网络层的目标:把数据分组一路送到接收机.  网络层利用下层--数据链路层提供的服 ...

  4. 安卓 build/core/Makefile 以及main.mk

    android make 系统总共分为四层 arch board device product 在各个字android.mk文件中引用的定义都存放在./build/core/下!比如android.m ...

  5. 锋利的jQuery(第二版)学习总结

    通过对<锋利的jQuery>(第二版)一书的学习,发现此书讲解通俗易懂,是学习jQuery的一本很好的指导书,特作如下总结. 此书主要讲解了jQuery的常用操作,包括认识jQuery,j ...

  6. 18) maven 项目结构:继承

    Project Inheritance [ɪn'herɪt(ə)ns] https://maven.apache.org/guides/introduction/introduction-to-the ...

  7. Python 之 Difflib

    Python 之 Difflib 2017年7月8日 word文档地址:https://wenku.baidu.com/view/36692440854769eae009581b6bd97f19237 ...

  8. POJ2385--Apple Catching(动态规划)

    It is a little known fact that cows love apples. Farmer John has two apple trees (which are convenie ...

  9. Java的StringBuffer和StringBuilder类

    StringBuffer (字符串缓冲对象) 概念:用于表示可以修改的字符串,称为字符串缓冲对象 作用:使用运算符的字符串将自动创建字符串缓冲对象 例如: str1+str2的操作,实际上是把str1 ...

  10. AngularJS 脏检查机制

    脏检查是AngularJS的核心机制之一,它是实现双向绑定.MVVM模式的重要基础. 一.digest循环 AngularJS将双向绑定转换为一个堆watch表达式,然后递归检查这些watch表达式的 ...