ORM全称ObjectRelationalMapping,即对象关系映射。简洁的说,ORM将数据库中的表与面向对象语言表达中的类创建了一类对应关系。那样,我们要操作数据库,数据库中的表或是表中的一条记录就可以直接根据操作类或是类案例来完成。
SQLAlchemy是Python社区最知名的ORM工具之一,为高效和性能的数据库访问设计方案,完成了完整的企业级持久模型。
SQLAlchemy优点:
-
简洁易读:将数据表抽象为对象(数据模型),更形象化易读。
-
可移植:封装了多种数据库引擎,应对多个数据库,实际操作基本相同,代码易维护。
-
更安全:有效避免SQL注入。
本文通过介绍Sqlite数据库的常见实际操作,来介绍一下SQLAlchemy的使用方法。SQLAlchemy具体的建立方式是将数据库表变换为Python类,其中数据列作为属性,数据库操作作为方法。
学习资料免费领取 60+ 名企内推资源倾情分享
SQLAlchem安装
Sqlite3是Python3标准库不需要另外安装,只需要安装SQLAlchemy即可。
pip install sqlalchemy
ORM 创建数据库连接
Sqlite3 创建数据库连接就是创建数据库,而其他MySQL等数据库,需要数据库已存在,才能创建数据库连接。
SQLite
以相对路径形式,在当前目录下创建数据库格式如下:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///AiTestOps.db')
以绝对路径形式创建数据库,格式如下:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///G:\python_sql\AiTestOps.db')
其它常用数据库的创建数据库连接方法
SQLAlchemy用一个字符串表示连接信息:
'数据库类型+数据库驱动名称://用户名:密码@IP地址:端口号/数据库名'
PostgreSQL数据库
from sqlalchemy import create_engine
# default, 连接串格式为 "数据库类型+数据库驱动://数据库用户名:数据库密码@IP地址:端口/数据库"
engine = create_engine('postgresql://username:password@127.0.0.1:9527/AiTestOps')
# psycopg2
engine = create_engine('postgresql+psycopg2://username:password@127.0.0.1:9527/AiTestOps')
# pg8000
engine = create_engine('postgresql+pg8000://username:password@127.0.0.1:9527/AiTestOps')
MySQL数据库
from sqlalchemy import create_engine
# default,连接串格式为 "数据库类型+数据库驱动://数据库用户名:数据库密码@IP地址:端口/数据库"
engine = create_engine('mysql://username:password@127.0.0.1:9527/AiTestOps')
# mysql-python
engine = create_engine('mysql+mysqldb://username:password@127.0.0.1:9527/AiTestOps')
# MySQL-connector-python
engine = create_engine('mysql+mysqlconnector://username:password@127.0.0.1:9527/AiTestOps')
Oracle数据库
from sqlalchemy import create_engine
# default,连接串格式为 "数据库类型+数据库驱动://数据库用户名:数据库密码@IP地址:端口/数据库"
engine = create_engine('oracle://username:password@127.0.0.1:9527/AiTestOps')
# cx_oracle
engine = create_engine('oracle+cx_oracle://username:password@127.0.0.1:9527/AiTestOps')
我们以在当前目录下创建SQLite数据库为例,后续各步同使用此数据库。我们在create_engine方法中补充了两个参数。如下:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///AiTestOps.db?check_same_thread=False', echo=True)
- echo:echo默认为False,表示不打印执行的SQL语句等较详细的执行信息,改为Ture表示让其打印。
- check_same_thread:check_same_thread默认为 False,sqlite默认建立的对象只能让建立该对象的线程使用,而sqlalchemy是多线程的,所以我们需要指定check_same_thread=False来让建立的对象任意线程都可使用。
定义映射(类与表的映射)
首先,我们建立基本映射类,后边具体的映射类(表)需要继承它。
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
然后,创建具体的映射类,我们这里以Person映射类为例,我们把Person类映射到Person表。
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# 定义映射类Person,并继承 Base
class Person(Base):
# 指定本类映射到 Person 表
__tablename__ = 'Person'
# 若有多个类指向同一张表,那么在后边的类需要把 extend_existing设为True,表示在已有列基础上进行扩展
# 或者换句话说,sqlalchemy 允许类是表的字集,如下:
# __table_args__ = {'extend_existing': True}
# 若表在同一个数据库服务(datebase)的