您好,我是码农飞哥,感谢您阅读本文!本文将主要介绍一款应用于Python语言中的ORM框架SQLAlchemy。ORM的是Object-Relational Mapping,作用是把关系数据库的表结构映射到对象上。
本demo使用的是MySQL数据库,ORM框架是SQLAlchemy框架。所以,我们首先需要通过Python的包管理工具安装需要的包。
pip install mysql-connector-python --allow-external mysql-connector-python
如果该命令安装失败则可以尝试下如下命令:
pip install mysql-connector
pip install sqlalchemy
软件 | 版本 |
---|---|
Python | 3.6.7 |
mysql-connector-python | 8.0.22 |
SQLAlchemy | 1.3.22 |
MySQL驱动和SQLAlchemy模块安装好之后,我们的准备工作就做完了,就下来就是使用了SQLAlchemy框架了。
该脚本创建一个名为job的数据库,然后在该数据库中创建一个名为job_user的表。接着向表中插入两条账号信息。执行该脚本就准备好了测试数据。
CREATE database if NOT EXISTS `job` default character set utf8mb4 collate utf8mb4_unicode_ci;
use `job`;
CREATE TABLE `job_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '账号',
`password` varchar(50) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`),
UNIQUE KEY `i_username` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `job_user`(`id`, `username`, `password`) VALUES (1, 'admin', '123');
INSERT INTO `job_user`(`id`, `username`, `password`) VALUES (2, 'zhangsan', '345');
# 导入相关的包
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类
Base = declarative_base()
# 初始化数据库连接
engine = create_engine('mysql+mysqlconnector://root:123@localhost:3306/job')
# 创建DBSession类型
DBSession = sessionmaker(bind=engine)
# 定义User对象
class User(Base):
# 表的名字
__tablename__ = 'job_user'
# 表的结构
id = Column(int(11), primary_key=True)
username = Column(String(20))
password = Column(String(20))
#将对象转成dict字典
def to_dict(self):
return {c.name: getattr(self, c.name, None)
for c in self.__table__.columns}
Base.to_dict = to_dict
如上代码,主要做了如下三件事情:
数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名
mysql+mysqlconnector://root:123@localhost:3306/job
就是说数据库类型是mysql,数据库驱动的名称是mysqlconnector,连接的用户名是root,连接的密码是123,机器地址是:localhost,端口号是:3306,数据库名称是job。这个连接的格式是固定的。接着通过如下语句来创建DBSession类型:
DBSession = sessionmaker(bind=engine)
插入数据的操作其实就是创建一个待插入的User对象,然后将该User对象放入session(会话)中进行提交。
#创建session对象
session = DBSession()
# 创建新User对象
new_user = User(id=3,username='ceshi',password='456')
# 添加到session
session.add(new_user)
# 提交即保存到数据库:
session.commit()
# 关闭session
session.close()
根据主键查询可以直接调用get方法,
user = session.query(User).get(1)
print(user and user.to_dict())
就可以直接得到如下结果:
{'id': 1, 'username': 'admin', 'password': '123'}
当然也可以这样写:
user = session.query(User) \
.filter(User.id == 1) \
.first()
print(user and user.to_dict())
上面get的方法比较简洁,只适用于主键查询,下面filter的方法比较通用,适用于所有字段的查询。其中first()的意思是返回查询结果中的第一条。
#all()方法是返回所有的查询结果
users = session.query(User) \
.filter(User.id == 1) \
.all()
#one()方法是只获取一条记录,如果找不到记录或者多条都会报错
user = session.query(User) \
.filter(User.id == 1) \
.one()
在实际项目中,我们查询数据通常是多条件查询,那么多条件查询的代码该怎么写呢?
user = session.query(User) \
.filter(User.username == 'admin',
User.password > '123') \
.all()
上面的代码的效果等同于下面的SQL语句;
select * from job_user where username='admin' and password='123'
#返回记录条数 count()
count = session \
.query(User) \
.filter(User.id == 3) \
.count()
print(count)
users = session \
.query(User.id, User.username) \
.filter(User.id > 2) \
.order_by(User.id.desc()) \
.all()
from sqlalchemy.sql import exists
is_exist = session \
.query(exists().where(User.id > 10)) \
.scalar()
#需要引入or_函数
from sqlalchemy import or_
users = session.query(User) \
.filter(or_(User.id == 1,
User.username =='zhangsan')) \
.all()
users = session.query(User) \
.filter(User.id.in_([1, 3, 5])) \
.all()
# 查询用户名包含「zhang」的用户账号
books = session.query(User) \
.filter(User.username.contains('zhang')) \
.all()
更新数据的操作其实就是首先查出待更新的数据,然后调用update方法更新成新数据。
session = DBSession()
new_user = session.query(User).filter(User.id == 2).update({"username": "lisi"})
session.commit()
session.close()
这里是将id等于2的那条数据的用户名由zhangsan改成lisi。同样的还是先创建session对象,然后提交session,最后关闭session。
删除数据与更新数据类似。也是先查出待删除的数据,如果存在则删除,这是物理删除。下面的语句是删除id等于3的用户账号。
# 创建session对象
session = DBSession()
old_user = session.query(User).get(3)
# 删除文件
session.delete(old_user)
# 提交即保存到数据库:
session.commit()
session.close()
本文首先介绍了SQLAlchemy框架的安装,接着介绍了如何通过该框架对数据库表进行增删改查,重点介绍了常用查询,查询的方法众多,其中使用最多的方法就是filter方法,我们的查询条件都是通过该方法传入的。希望对读者朋友们有所帮助。