Python SQLAlchemy入门教程(基本用法)

作者:Yabea 时间:2022-10-05 04:08:55 

本文将以Mysql举例,介绍sqlalchemy的基本用法。其中,Python版本为2.7,sqlalchemy版本为1.1.6。

一. 介绍

SQLAlchemy是Python中最有名的ORM工具。

关于ORM:

全称Object Relational Mapping(对象关系映射)。

特点是操纵Python对象而不是SQL查询,也就是在代码层面考虑的是对象,而不是SQL,体现的是一种程序化思维,这样使得Python程序更加简洁易读。

具体的实现方式是将数据库表转换为Python类,其中数据列作为属性,数据库操作作为方法。

优点:

  • 简洁易读:将数据表抽象为对象(数据模型),更直观易读

  • 可移植:封装了多种数据库引擎,面对多个数据库,操作基本一致,代码易维护

  • 更安全:有效避免SQL注入

为什么要用sqlalchemy?

虽然性能稍稍不及原生SQL,但是操作数据库真的很方便!

二. 使用

概念和数据类型

概念


概念对应数据库说明
Engine连接驱动引擎
Session连接池,事务由此开始查询
Model类定义
Column
Query若干行可以链式添加多个条件

常见数据类型


数据类型数据库数据类型python数据类型说明
Integerintint整形,32位
Stringvarcharstring字符串
Texttextstring长字符串
Floatfloatfloat浮点型
BooleantinyintboolTrue / False
Datedatedatetime.date存储时间年月日
DateTimedatetimedatetime.datetime存储年月日时分秒毫秒等
Timetimedatetime.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
           )
  • echo: 当设置为True时会将orm语句转化为sql语句打印,一般debug的时候可用

  • pool_size: 连接池的大小,默认为5个,设置为0时表示连接无限制

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

  • flush:预提交,提交到数据库文件,还未写入数据库文件中

  • commit:提交了一个事务

  • rollback:回滚

  • 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()

通常这两个方法都会用到的,所以一定要掌握它们的区别:

filterfilter_by支持所有比较运算符,相等比较用比较用==只能使用"=","!="和"><"过滤用类名.属性名过滤用属性名不支持组合查询,只能连续调用filter变相实现参数是**kwargs,支持组合查询支持and,or和in等



更新数据有两种方法,一种是使用query中的update方法:

filterfilter_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

总结

以上所述是小编给大家介绍的Python SQLAlchemy入门教程网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://www.cnblogs.com/ybjourney/p/11832045.html

标签:Python,SQLAlchemy
0
投稿

猜你喜欢

  • Python中更优雅的日志记录方案详解

    2023-09-02 13:43:03
  • 使用babel-plugin-import 实现自动按需引入方式

    2024-04-27 16:00:42
  • 找Python安装目录,设置环境路径以及在命令行运行python脚本实例

    2022-06-01 23:28:56
  • python将unicode转为str的方法

    2022-04-30 23:15:18
  • Go语言导出内容到Excel的方法

    2024-02-11 17:18:56
  • 七十六个网站用户体验要点

    2010-08-11 14:52:00
  • pyqt5 设置窗体透明控件不透明的操作

    2022-04-18 09:16:16
  • Oracle回滚段的概念,用法和规划及问题的解决

    2010-07-26 13:08:00
  • 盘点30个经典常用的JavaScript知识点

    2024-05-13 09:36:06
  • oracle 发送邮件 实现方法

    2009-06-10 17:49:00
  • 纯CSS图片预加载

    2009-10-28 18:40:00
  • python批量下载抖音视频

    2023-09-05 11:26:14
  • Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法

    2024-01-21 05:57:53
  • Vue结合Video.js播放m3u8视频流的方法示例

    2023-07-02 16:55:40
  • python中Task封装协程的知识点总结

    2022-10-25 13:25:02
  • 详解Python如何使用并发模型编程

    2021-10-30 06:39:23
  • 详解微信小程序网络请求接口封装实例

    2024-06-12 04:08:54
  • python TKinter弹出式菜单的实例方法

    2023-03-25 05:59:54
  • 了解ASP的基本语法和变量

    2008-01-16 13:03:00
  • Perl实现的Linux下socket代理服务器

    2023-04-28 10:57:41
  • asp之家 网络编程 m.aspxhome.com