5-sqlalchemy和初始化数据库

592 阅读4分钟

回顾

有些人可能不太清楚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__.py dao层初始化所有表,以后新增一个表都需要在这儿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()生效

image.png

验证

启动服务,查看到数据库中,出现abandon_user表且设置的各项内容都已生效

image.png