Python SQLAlchemy

2020-11-09 14:32:00
六月
转贴 2292

一. 介绍

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

关于ORM:

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

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

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

优点:

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

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

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

1.安装

pip install SQLalchemy

2. 创建连接

from sqlalchemy import create_engine

engine = create_engine(" mysql://user:password@hostname/dbname?charset=uft8")

  注:mysql+pymysql或者mysql+mysqlconnector 或者 mysql+mysqldb

3. 创建数据库表类(模型)

我们操作表的时候就需要通过操作对象来实现,现在我们来创建一个类。

# Column 定义字段,Integer、String 分别为整数和字符串数据类型
from sqlalchemy import Column, Integer, Stringclass 
User(Base):           # 继承声明基类
    __tablename__ = 'user'  # 设置数据表名字,不可省略
    id = Column(Integer, primary_key=True)   # 设置该字段为主键
    # unique 设置唯一约束,nullable 设置非空约束
    name = Column(String(64), unique=True, nullable=False)
    email = Column(String(64), unique=True)    # 此特殊方法定义实例的打印样式
    def __init__(self, name, email):
       self.name = name
       self.email = email
    
    def __repr__(self):
        return '<User: {}>'.format(self.name)

数据库表模型类通过__tablename__和表关联起来,Column表示数据表的列。

4. 生成数据库表

Base.metadata.create_all(engine)

创建表,如果存在则忽略,执行以上代码,就会发现在db中创建了users表。

操作数据

表创建好了就是操作数据了,常见的操作增删改查。

sqlalchemy中使用session用于创建程序和数据库之间的会话,所有对象的载入和保存都需要通过session对象。

通过sessionmaker调用创建一个工厂,并关联Engine以确保每个session都可以使用该Engine连接资源。

session的常见操作方法包括:

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

  • commit:提交了一个事务

  • rollback:回滚

  • close:关闭

常见数据库操作CRUD

增加: session.add()将会把Model加入当前session维护的持久空间(可以从session.dirty看到)中,直到commit时提交到数据库。

查询:通常我们通过以上查询模式获取数据,需要注意的是,通过session.query()我们查询返回了一个Query对象,此时还没有去具体的数据库中查询,只有当执行具体的.all(),.first()等函数时才会真的去操作数据库。

修改: 更新数据有两种方法,一种是使用query中的update方法,另一种是操作对应的表模型

删除: 和更新数据类似,删除数据也有两种方法

参考: https://www.liaoxuefeng.com/wiki/897692888725344/955081460091040

https://www.jb51.net/article/173950.htm

https://www.cnblogs.com/pcat/p/6021556.html

https://www.jb51.net/article/183794.htm

发表评论
评论通过审核后显示。