Python SQLAlchemy入门教程

本文将以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

**优势: **数据库

  1. 简洁易读:将数据表抽象为对象(数据模型),更直观易读
  2. 可移植:封装了多种数据库引擎,面对多个数据库,操做基本一致,代码易维护
  3. 更安全:有效避免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
                       )
  1. echo: 当设置为True时会将orm语句转化为sql语句打印,通常debug的时候可用
  2. pool_size: 链接池的大小,默认为5个,设置为0时表示链接无限制
  3. pool_recycle: 设置时间以限制数据库多久没链接自动断开

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的常见操做方法包括:

  1. flush:预提交,提交到数据库文件,还未写入数据库文件中
  2. commit:提交了一个事务
  3. rollback:回滚
  4. close:关闭

举个最简单的例子:

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

相关文章
相关标签/搜索