• SQLAlchemy使用教程(以SQLite为例)


    1.  安装依赖

      pip3 install sqlalchemy==1.4.46
      pip install sqlacodegen

      如果是mysql则多安装一个依赖

      pip3 install pymysql
    2. 在项目中新建一个db文件夹(后来:推荐将xxx.db文件放在启动文件同级目录,不要再新建文件夹了,后面就可以使用相对路径了,比较方便)

    3. 在db文件夹中新建SQLite数据库(即新建一个以.db为后缀的空文件)【mysql跳过这一步】

    4. 新建配置文件db_config.py
      其他数据连接的写法参考:SQLAlchemy创建各种数据库连接的_苍穹之跃的博客-CSDN博客

      1. import os
      2. import platform
      3. from sqlalchemy import create_engine
      4. from sqlalchemy.orm import declarative_base, sessionmaker
      5. from contextlib import contextmanager
      6. """
      7. Mysql连接
      8. """
      9. # MYSQL_URL = f'mysql+pymysql://root:123456@localhost:3306/fast'
      10. """
      11. Sqlite连接:注意注意注意:这个URI连接的相对地址,指的是相对于最外层调用的文件的相对位置,而不是此文件的相对位置。所以最好是使用绝对路径。
      12. """
      13. # 获取当前文件的绝对路径
      14. SQLITE_URI = None
      15. if str(platform.system().lower()) == 'windows':
      16. path = __file__.replace(fr"\{os.path.basename(__file__)}", "").replace("\\\\", "\\")
      17. SQLITE_URI = fr'sqlite:///{path}\fast.db''?check_same_thread=False'
      18. print(f'数据库路径:{SQLITE_URI}')
      19. elif str(platform.system().lower()) == 'linux':
      20. path = __file__.replace(fr"/{os.path.basename(__file__)}", "").replace("//", "/")
      21. SQLITE_URI = fr'sqlite:///{path}/fast.db''?check_same_thread=False'
      22. print(f'数据库路径:{SQLITE_URI}')
      23. else:
      24. print(f"未知系统:{platform.system().lower()}")
      25. # 操作数据句柄
      26. engine = create_engine(SQLITE_URI)
      27. Base = declarative_base(engine)
      28. DbSession = sessionmaker(bind=engine)
      29. # 这里一定要用上下文去管理session,否则会出现很多诡异的情况!!!切记
      30. db_session = DbSession()
      31. @contextmanager
      32. def session_maker(session=db_session):
      33. try:
      34. yield session
      35. session.commit()
      36. except:
      37. session.rollback()
      38. raise
      39. finally:
      40. session.close()
      41. # 逆向工程 自动生成模型文件
      42. if __name__ == '__main__':
      43. os.system(f'sqlacodegen {SQLITE_URI} > models.py')
    5. 用Navicat连接第三步创建的SQLite数据库,并新建业务表

    6. 执行db_config文件中的逆向工程

      此时在db文件夹下会自动生成相应的模型文件:models.py,此文件最好不要手动修改。如果后面改动了表结构,再执行一次逆向工程即可。

    7. ORM操作

      1. from sqlalchemy import func
      2. from db.db_config import session
      3. from db.models import DatabaseConnection
      4. if __name__ == '__main__':
      5. with session_maker() as session:
      6. # ADD
      7. session.add(DatabaseConnection(link_name='代码生成器', type='DAO', host='localhost', port='3306', username='admin',password='123456'))
      8. session.commit()
      9. # ADD_BATCH
      10. session.add_all([
      11. DatabaseConnection(link_name='代码生成器1', type='DAO', host='localhost', port='3306', username='admin',password='123456'),
      12. DatabaseConnection(link_name='代码生成器2', type='DAO', host='localhost', port='3306', username='admin',password='123456'),
      13. DatabaseConnection(link_name='代码生成器3', type='DAO', host='localhost', port='3306', username='admin',password='123456')
      14. ])
      15. session.commit()
      16. # DELETE
      17. session.query(DatabaseConnection).filter(DatabaseConnection.id == 6).delete()
      18. session.commit()
      19. # UPDATE
      20. session.query(DatabaseConnection).filter(DatabaseConnection.id == 5).update({DatabaseConnection.link_name: '安特磁材2'})
      21. session.commit()
      22. # SELECT 精确查询
      23. session.query(DatabaseConnection).filter(DatabaseConnection.host == 'localhost').all()
      24. # SELECT 获取部分字段
      25. session.query(DatabaseConnection.link_name).filter(DatabaseConnection.host == 'localhost').all()
      26. # SELECT 模糊查询
      27. session.query(DatabaseConnection).filter(DatabaseConnection.port.like('%33%')).all()
      28. # SELECT 正则查询
      29. session.query(DatabaseConnection).filter(DatabaseConnection.port.op("regexp")("[\d\D]*")).all()
      30. # SELECT 排序
      31. session.query(CodeTemplateGroup).order_by(CodeTemplateGroup.is_default.desc()).all()
      32. # SELECT 统计查询
      33. session.query(DatabaseConnection).filter(DatabaseConnection.port.op("regexp")("[\d\D]*")).count()
      34. # SELECT 调用数据库内置函数
      35. session.query(func.count(DatabaseConnection.link_name)).one()
      36. session.query(func.count(DatabaseConnection.link_name)).one_or_none()
      37. # 执行原生SQL
      38. records = session.execute('select * from database_connection')
      39. # 逻辑操作 not_取反,or_取或,and_取与
      40. session.query(OperatingInstructionLog) \
      41. .filter(OperatingInstructionLog.type == 2) \
      42. .filter(
      43. not_(or_(OperatingInstructionLog.open_time >= datetime(date.year, date.month, date.day + 1, 0, 0, 0),
      44. OperatingInstructionLog.close_time <= datetime(date.year, date.month, date.day, 0, 0, 0)))) \
      45. .order_by(OperatingInstructionLog.open_time.asc())\
      46. .all()

    8.擦除对象

  • 相关阅读:
    PDCA方法论
    如何使用 FaceIO 在 Vue.JS 中实现人脸识别?
    docker安装zookeeper(单机版)
    出现问题,你的pin不可用
    CATT的应用
    Apache Doris 2.x 版本【保姆级】安装+使用教程
    01、Servlet核心技术(上)
    【Redis学习笔记】第十四章 Redis企业级解决方案与性能监控
    Centos脚本编程一例,程序运行提示菜单、自动查杀进程和后台运行
    基于桶的排序之基数排序以及排序方法总结
  • 原文地址:https://blog.csdn.net/wenxingchen/article/details/127801084