回顾
有些人可能不太清楚sqlalchemy是什么东西。简单的说,他就是一个orm库,帮助咱们能够更好地跟db打交道的。既然是登录,那么肯定需要有持久化的数据。那么我们肯定需要建立用户相关的表。
选型
- pymysql
pymysql 是一个纯 Python 实现的 MySQL 客户端,它的使用方式与 Python 内置的 sqlite3 库类似,可以在 Python 代码中直接使用 SQL 语句来操作 MySQL 数据库。pymysql 支持事务、连接池、SSL 加密等功能,性能也比较不错。
- mysql-connector-python
mysql-connector-python 则是 MySQL 官方提供的 Python 客户端,它使用 C 语言实现了底层的通信协议,因此性能比 pymysql 更好。mysql-connector-python 支持 Python 2 和 Python 3,支持多种操作系统和平台,同时也支持事务、连接池、SSL 加密等功能。
- SQLAlchemy
一个 Python 的 ORM(对象关系映射)库,提供了一个高级的 SQL 生成器和一个完整的对象关系映射系统,可以与多种数据库一起使用,包括 MySQL。
综合来说,如果需要更高的性能和更好的兼容性,可以选择 mysql-connector-python。如果更注重代码的简洁性和可读性,可以选择 pymysql。在此我会选择使用mysql-connector-python来在教程中主要使用。
前置准备
-
安装MySQL
根据自己的系统(Windows/Mac/Linux)安装好对应的MySQL并设置好账号密码,这里就不教育大家怎么安装了。端口号用默认的3306即可。(实在搞不定,用别人的数据库也可)
-
安装sqlalchemy
pip install sqlalchemy
- 安装mysql-connector-python
pip install mysql-connector-python
- abandon-server/config.py配置mysql连接信息,更改后的config信息如下:
# 基础配置类
import os
from urllib import parse
class AbandonConfig(object):
# 项目根目录
PATH: str = os.path.dirname(os.path.abspath(__file__))
# 日志配置信息
LOG_DIR: str = 'logs' # 日志存放的目录名称
LOG_ROTATE: str = '1' # 日志多久分割一次,单位day
LOG_SAVE: str = '7' # 日志留存多久,单位day
# 服务信息
SERVER_HOST: str = "127.0.0.1"
SERVER_PORT: int = 9923
# MySQL配置信息
MYSQL_HOST: str = '127.0.0.1'
MYSQL_PORT: int = 3306
MYSQL_USER: str = 'root'
MYSQL_PASSWD: str = 'yourpasswd'
MYSQL_DB: str = 'abandon'
# sqlalchemy,此处采用parse是因为如果你的密码包含特殊字符,如@:等,会有识别冲突,因此使用parse
SQLALCHEMY_DATABASE_URI = 'mysql+mysqlconnector://{}:{}@{}:{}/{}'.format(
MYSQL_USER, parse.quote_plus(MYSQL_PASSWD), MYSQL_HOST, MYSQL_PORT, MYSQL_DB)
if __name__ == '__main__':
print(AbandonConfig.LOG_ROTATE)
编码
- 在
abandon/app/models/__init__.py初始化db
代码很简单,就是将app赋给SQLAlchemy从而生成一个db对象。
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from config import AbandonConfig
engine = create_engine(AbandonConfig.SQLALCHEMY_DATABASE_URI)
Session = sessionmaker(engine)
# 创建对象的基类:
Base = declarative_base()
- 在
abandon/app/models/user.py建立用户表
既然是ORM,那么咱们的User表的体现即是Python中的一个类。
因为目前,还不太了解用户表的具体需要字段。但是我们能大概设计一下这个表,首先需要的字段肯定有用户名,密码,用户id,邮箱,团队id,职位等。
from datetime import datetime
# dColumn 用于定义表字段,String 和 INT 分别表示字符串和整数类型,DATETIME 表示日期时间类型
from sqlalchemy import Column, String, INT, DATETIME
from src.app.models import Base
class User(Base):
# 定义表名为 "abandon_user",表名和类名不必相同,但通常保持一致比较好
__tablename__ = "abandon_user"
id = Column(INT, primary_key=True, comment="用户唯一id")
# 定义字段 id,类型为整数,是主键,注释为 "用户唯一id"
username = Column(String(16), unique=True, index=True, comment="用户名")
# 定义字段 username,类型为字符串,长度为 16,唯一且建立索引,注释为 "用户名"
name = Column(String(16), index=True, comment="姓名")
# 定义字段 name,类型为字符串,长度为 16,建立索引,注释为 "姓名"
password = Column(String(32), unique=False, comment="用户密码")
# 定义字段 password,类型为字符串,长度为 32,不唯一,注释为 "用户密码"
email = Column(String(64), unique=True, nullable=False, comment="用户邮箱")
# 定义字段 email,类型为字符串,长度为 64,唯一且不能为空,注释为 "用户邮箱"
role = Column(INT, default=0, comment="0: 普通用户 1: 组长 2: 超级管理员")
# 定义字段 role,类型为整数,缺省值为 0,注释为 "0: 普通用户 1: 组长 2: 超级管理员"
created_at = Column(DATETIME, nullable=False, comment="创建时间")
# 定义字段 created_at,类型为日期时间,不能为空,注释为 "创建时间"
updated_at = Column(DATETIME, nullable=False, comment="更改时间")
# 定义字段 updated_at,类型为日期时间,不能为空,注释为 "更改时间"
deleted_at = Column(DATETIME, comment="删除时间")
# 定义字段 deleted_at,类型为日期时间,可为空,注释为 "删除时间"
last_login_at = Column(DATETIME, comment="上次登录时间")
# 定义字段 last_login_at,类型为日期时间,可为空,注释为 "上次登录时间"
def __init__(self, username, name, password, email):
self.username = username
self.password = password
self.email = email
self.name = name
self.created_at = datetime.now()
self.updated_at = datetime.now()
self.role = 0
- 在
abandon-server/src/app/dao/__init__.pydao层初始化所有表,以后新增一个表都需要在这儿import一次
from src.app.models import Base, engine
from src.app.models.user import User
Base.metadata.create_all(engine)
- 在main.py引入dao包使得建表语句db.create_all()生效
验证
启动服务,查看到数据库中,出现abandon_user表且设置的各项内容都已生效