本文将以Mysql举例,介绍sqlalchemy的基本用法。其中,Python版本为2.7,sqlalchemy版本为1.1.6。html
SQLAlchemy是Python中最有名的ORM工具。python
关于ORM:mysql
全称Object Relational Mapping(对象关系映射)。git
特色是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思惟,这样使得Python程序更加简洁易读。github
具体的实现方式是将数据库表转换为Python类,其中数据列做为属性,数据库操做做为方法。sql
**优势: **数据库
为何要用sqlalchemy?安全
虽然性能稍稍不及原生SQL,可是操做数据库真的很方便!session
概念app
概念 | 对应数据库 | 说明 |
---|---|---|
Engine | 链接 | 驱动引擎 |
Session | 链接池,事务 | 由此开始查询 |
Model | 表 | 类定义 |
Column | 列 | |
Query | 若干行 | 能够链式添加多个条件 |
常见数据类型
数据类型 | 数据库数据类型 | python数据类型 | 说明 |
---|---|---|---|
Integer | int | int | 整形,32位 |
String | varchar | string | 字符串 |
Text | text | string | 长字符串 |
Float | float | float | 浮点型 |
Boolean | tinyint | bool | True / False |
Date | date | datetime.date | 存储时间年月日 |
DateTime | datetime | datetime.datetime | 存储年月日时分秒毫秒等 |
Time | time | datetime.datetime | 存储时分秒 |
**1.安装 **
pip install SQLalchemy
2. 建立链接
from sqlalchemy import create_engine engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8")
这行代码初始化建立了Engine,Engine内部维护了一个Pool(链接池)和Dialect(方言),方言来识别具体链接数据库种类。
建立好了Engine的同时,Pool和Dialect也已经建立好了,可是此时并无真正与数据库链接,等到执行具体的语句.connect()等时才会链接到数据库。
create_engine还有其它可选的参数,好比:
engine = create_engine("mysql://user:password@hostname/dbname?charset=uft8", echo=True, pool_size=8, pool_recycle=60*30 )
3. 建立数据库表类(模型)
前面有提到ORM的重要特色,那么咱们操做表的时候就须要经过操做对象来实现,如今咱们来建立一个类,以常见的用户表举例:
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Users(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String(64), unique=True) email = Column(String(64)) def __init__(self, name, email): self.name = name self.email = email
declarative_base()是sqlalchemy内部封装的一个方法,经过其构造一个基类,这个基类和它的子类,能够将Python类和数据库表关联映射起来。
数据库表模型类经过__tablename__和表关联起来,Column表示数据表的列。
4. 生成数据库表
Base.metadata.create_all(engine)
建立表,若是存在则忽略,执行以上代码,就会发如今db中建立了users表。
表建立好了就是操做数据了,常见的操做增删改查,咱们一一介绍。
session
sqlalchemy中使用session用于建立程序和数据库之间的会话,全部对象的载入和保存都须要经过session对象 。
经过sessionmaker调用建立一个工厂,并关联Engine以确保每一个session均可以使用该Engine链接资源:
from sqlalchemy.orm import sessionmaker # 建立session DbSession = sessionmaker(bind=engine) session = DbSession()
session的常见操做方法包括:
增
举个最简单的例子:
add_user = Users("test", "test123@qq.com") session.add(add_user) session.commit()
session.add()将会把Model加入当前session维护的持久空间(能够从session.dirty看到)中,直到commit时提交到数据库。
Q1:add以后如何直接返回对象的属性?
能够在add以后执行db.session.flush(),这样即可在session中get到对象的属性。
Q2:如何进行批量插入,性能比较?
批量插入共有如下几种方法,对它们的批量作了比较,分别是:
session.add_all() < bulk_save_object() < bulk_insert_mappings() < SQLAlchemy_core()
查
查询是最经常使用的一个操做了,举个最简单的查询例子:
users = session.query(Users).filter_by(id=1).all() for item in users: print(item.name)
一般咱们经过以上查询模式获取数据,须要注意的是,经过session.query()咱们查询返回了一个Query对象,此时尚未去具体的数据库中查询,只有当执行具体的.all(),.first()等函数时才会真的去操做数据库。
其中,query有filter和filter_by两个过滤方法,上述例子也可写为:
users = session.query(Users).filter_by(Users.id == 1).all()
一般这两个方法都会用到的,因此必定要掌握它们的区别:
filter | filter_by |
---|---|
支持全部比较运算符,相等比较用比较用== | 只能使用"=","!="和"><" |
过滤用类名.属性名 | 过滤用属性名 |
不支持组合查询,只能连续调用filter变相实现 | 参数是**kwargs,支持组合查询 |
支持and,or和in等 |
改
更新数据有两种方法,一种是使用query中的update方法:
session.query(Users).filter_by(id=1).update({'name': "Jack"})
另外一种是操做对应的表模型:
users = session.query(Users).filter_by(name="Jack").first() users.name = "test" session.add(users)
这两种方式呢,通常批量更新的话我会选前者,而要对查询获取对象属性以后再更新的场景就须要使用后者。
删
和更新数据相似,删除数据也有两种方法,第一种:
delete_users = session.query(Users).filter(Users.name == "test").first() if delete_users: session.delete(delete_users) session.commit()
第二种:
session.query(Users).filter(Users.name == "test").delete() session.commit()
批量删除时推荐使用第二种。
以上,就是Python sqlalchemy的基本用法。
代码可参照:my github
原文出处:https://www.cnblogs.com/ybjourney/p/11832045.html