首页 > 数据库 >使用 SQLAlchemy 实现用户数据库管理

使用 SQLAlchemy 实现用户数据库管理

时间:2024-02-02 13:22:06浏览次数:45  
标签:__ SQLAlchemy False Column 数据库 py 用户 SQLALCHEMY POOL

使用 PyQt5(PySide2)+SQLAlchemy 做一个登录注册页(三)

本文将介绍自己用 PyQt5+SQLAlchemy 做的一个登录注册页,使用邮箱接收验证码本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将 PyQt5 改为 PySide2 以获得更宽松的开源协议

本文由于涉及到的代码较多,将会是一个系列,会有多篇文章

系列文章索引

  1. 设计登录注册页面
  2. 添加代码运行登录注册页,并为其添加一些样式,和调用资源文件
  3. 使用 SQLAlchemy 实现用户数据库管理

必要说明

  • 使用的环境 requirements.txt
# Python3.8.10 x32
# Windows10 x64
PyQt5
pyqt5-tools
PyMySQL~=1.1.0
sqlalchemy~=2.0.25
bcrypt~=4.1.2
  • 项目结构(显示变化的部分)
--- QtLoginRegistration
  |--- db
     |--- __init__.py
     |--- modules.py       # 数据模型
  |--- setting.py          # 设置

使用 SQLAlchemy 实现用户数据库管理

第1步

新建setting.py 文件,统一存放设置项目

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : QtLoginRegistration 
@ File        : setting.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""
import os


# 使用方法:若需要修改默认参数,则直接在子类中用相同参数名称重新设置即可
# 需要配置的环境变量:EMAIL_PASSWORD,DB_PASSWORD
class Setting(object):
    EMAIL_USERNAME = "<[email protected]>"  # 发送邮件的邮箱
    EMAIL_PASSWORD = os.getenv("EMAIL_PASSWORD")  # 邮箱密码,配置环境变量:EMAIL_PASSWORD

    # Database 默认参数
    # 使用SQLALCHEMY + PYMYSQL操作数据库
    # 配置参见:https://www.osgeo.cn/sqlalchemy/core/engines.html
    DB = {
        'HOST': '192.167.6.139',
        'PORT': 3307,
        'USERNAME': 'test',
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'DBNAME': 'login-register'
    }
    URI = f"mysql+pymysql://{DB['USERNAME']}:{DB['PASSWORD']}@{DB['HOST']}:{DB['PORT']}/{DB['DBNAME']}"
    SQLALCHEMY_DATABASE_URI = URI
    SQLALCHEMY_COMMIT_ON_TEARDOWN = False  # 自动提交数据处理
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 自动更跟踪数据库,性能不好
    SQLALCHEMY_POOL_SIZE = 10  # 连接数,默认5
    SQLALCHEMY_MAX_OVERFLOW = 20  # 超出连接数时,允许再新建的连接数,但是这5个人时不使用时,直接回收,默认10
    SQLALCHEMY_POOL_TIMEOUT = 30  # 等待可用连接时间,超时则报错,默认为30秒
    SQLALCHEMY_POOL_RECYCLE = 3600  # 连接生存时长(秒),超过则该连接被回收,再生存新连接,默认-1不回收连接
    SQLALCHEMY_POOL_PRE_PING = True  # 连接池的“预ping”,在每次签出时测试连接的活动性,若出现disconnect错误,该连接将立即被回收

    SQLALCHEMY_ECHO = False  # 显示原始SQL语句
    SQLALCHEMY_ECHO_POOL = False  # 连接池记录信息


class DevelopConfig(Setting):
    """开发环境"""
    # Database
    SQLALCHEMY_ECHO = True  # 显示原始SQL语句
    SQLALCHEMY_ECHO_POOL = True  # 连接池记录信息


# 环境映射关系
mapping = {
    'develop': DevelopConfig,
}

CONFIG = mapping[os.environ.get('APP_ENV', 'develop').lower()]()  # 获取指定的环境


第2步

新建 db/__init__.py中,创建数据库连接和会话

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : QtLoginRegistration 
@ File        : __init__.py.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""

from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker

from setting import CONFIG

# 创建连接
engine = create_engine(
    url=CONFIG.SQLALCHEMY_DATABASE_URI,
    pool_size=CONFIG.SQLALCHEMY_POOL_SIZE,
    max_overflow=CONFIG.SQLALCHEMY_MAX_OVERFLOW,
    pool_recycle=CONFIG.SQLALCHEMY_POOL_RECYCLE,
    pool_timeout=CONFIG.SQLALCHEMY_POOL_TIMEOUT,
    pool_pre_ping=CONFIG.SQLALCHEMY_POOL_PRE_PING,
    echo=CONFIG.SQLALCHEMY_ECHO,
    echo_pool=CONFIG.SQLALCHEMY_ECHO_POOL
)

# 连接会话
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)

Base = declarative_base()


def get_session():
    """获取会话"""
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


第3步

新建 db/modules.py,存放数据库映射模型

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ Project     : QtLoginRegistration 
@ File        : modules.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""
from sqlalchemy import UniqueConstraint
from sqlalchemy import Column, Integer, String, DateTime

from db import Base


class User(Base):
    """用户表"""
    __tablename__ = 'user'  # 指定表名
    id = Column(Integer, primary_key=True, autoincrement=True, nullable=False)
    name = Column(String(255), nullable=True, comment='用户名称')
    username = Column(String(20), nullable=False, comment='用户账号')
    password = Column(String(255), nullable=False, comment='密码')
    email = Column(String(255), nullable=False, comment='邮箱')
    sex = Column(String(1), nullable=True, server_default='1', comment='性别:男1,女0')
    disabled = Column(String(1), nullable=False, server_default='1', comment='禁用用户:启动1,禁用0')

    createTime: str = Column(DateTime, nullable=False, comment='创建时间')
    deleted = Column(String(1), nullable=False, server_default='0', comment='删除标志')

    UniqueConstraint(username, name='usernameUnique')  # 账号唯一
    UniqueConstraint(email, name='emailUnique')  # 邮箱唯一

    def __repr__(self):
        return '<user %r,%r>' % (self.id, self.username)


if __name__ == '__main__':
    from db import engine

    Base.metadata.drop_all(bind=engine)  # 删除所有表
    Base.metadata.create_all(bind=engine)  # 创建所有表


第4步

  • MySQL数据库中,创建名为login-register数据库
  • 执行db/modules.py,创建用户表
  • 最终效果如下
    image
  • 并插入一个测试用户,用户密码是:111111
INSERT INTO `login-register`.`user` (`id`, `name`, `username`, `password`, `email`, `sex`, `disabled`, `createTime`, `deleted`) VALUES (1, '', 'test', '$2b$12$NqJM6ypRZfg..w5uWsrS/uxz/bi6TSIpKQZBpD20dCy96Fk47p6PS', '[email protected]', '1', '1', '2024-02-02 13:05:57', '0');

GitHub完整代码
本文章的原文地址
GitHub主页

标签:__,SQLAlchemy,False,Column,数据库,py,用户,SQLALCHEMY,POOL
From: https://www.cnblogs.com/yqbaowo/p/18002609

相关文章

  • kettle9.1连接MySQL8.0数据库报错:
    Connectionfailed.Verifyallconnectionparametersandconfirmthattheappropriatedriverisinstalled.Theservertimezonevalue'Öйú±ê׼ʱ¼ä'isunrecognizedorrepresentsmorethanonetimezone.YoumustconfigureeithertheserverorJD......
  • Ubuntu开启允许root用户访问ssh
    1、编辑/etc/ssh/sshd_config文件vim/etc/ssh/sshd_config2、设置允许roo登录找到PermitRootLogin这个属性,默认是注释掉的,我们可以复制一行将其设置为yes即可。设置完成后记得:wq保存文件哦。3、重启ssh服务systemctlrestartssh参考链接:https://cloud.tence......
  • 安装mariadb数据库
    1、先安装mariadb数据库sudoapt-getinstallmariadb-servermariadb-client2、查看mysql版本和运行状态查看版本mysql--version输出类似以下:mysqlVer15.1Distrib10.1.29-MariaDB,fordebian-linux-gnu(x86_64)usingreadline5.2查看服务运行状态sudoservicem......
  • mysql数据库应用
    一:安装数据库管理工具1.进入navicat官网https://navicat.com.cn/2.下载navicatformysql,选免费试用也可直接购买3.安装好后一直点下一步即可二:数据库创建1.新建链接mysql,输入连接名和密码(连接名任意取,密码输入之前设置的密码)2.右键mysql新建数据库,输入你取的数据库......
  • 【面试突击】数据库面试实战(上)
    欢迎关注公众号【11来了】,及时收到AI前沿项目工具及新技术的推送!在我后台回复「资料」可领取编程高频电子书!在我后台回复「面试」可领取硬核面试笔记!数据库面试实战数据库方面也是面试中的基础知识,基本上都是必问的,其中索引、事务更是重中之重!存储引擎先来说一下MySQL的存储......
  • Blazor快速开发框架Known-更换数据库
    本文介绍如何更换框架默认的数据库,下面以MySQL数据库为例:操作步骤双击KIMS.Shared项目,打开项目文件,引用MySqlConnector数据库访问包<PackageReferenceInclude="MySqlConnector"Version="2.3.3"/>其他数据库访问包如下://SQLite<PackageReferenceInclude="Microsoft.Da......
  • UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子
    UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子(自己学习记录一下,不一定合理,仅供参考)本例子是使用ADO等组件连接一个云服务器的一个数据库,调用GetOrg存储过程,把机构信息展现把结果导出的一个EXECL表里,并下载把显示的HSate的值进行替换1表示正常,其他表示暂停......
  • 再看这个公式:用户价值=新体验-旧体验-替换成本
     用户价值=新体验-旧体验-替换成本俞军这个公式已经提出来很多年了,但是并不是很容易理解,甚至有点不符合常识,所以并不容易记住,每次看到都像新的一样,得思考好久去琢磨他的意思。价值不是马克思说的无差别的人类劳动,而是一种及其主观的感觉,但又是能够被操控和塑造的。产品经理应......
  • 【Django开发】到1开发美多商城项目第3篇:用户注册业务实现(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目(4.0版本)含代码和文档。功能包括前后端不分离,方便SEO。采用Django+Jinja2模板引擎+Vue.js实现前后端逻辑,Nginx服务器(反向代理)Nginx服务器(静态首页、商品详情页、uwsgi......
  • 最新中国数据库排行出炉:阿里自研PolarDB首次登顶!
    今天,数据库社区“墨天轮”发布了最新的一期中国数据库流行度排行榜,阿里云自研云原生数据库PolarDB首次登顶,并刷新了榜单总分纪录。该榜单根据搜索引擎数据、核心案例数、资质数量、专利数、论文数等标准,对目前主流的国产数据库进行综合评比,体现了数据库在互联网上的流行度。在20......