1、原生SQL的一些弊端:在项目越来越大时

  • SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近似的SQL语句
  • 很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,很容易漏掉某些SQL语句的修改
  • 写SQL时容易忽略web安全问题,防止SQL注入

    2、ORM对象关系映射:Object Relationship Mapping

    通过ORM我们可以通过类的方式去操作数据库,而不需要写原生的SQL语句。通过把表映射成类,把行作为实例对象,字段作为属性,ORM在执行对象操作时候最终还是会吧对应的操作转化为数据库原生语句。

  • 数据表 —> 类

  • 行 —> 记录 —> 实例对象
  • 列 —> 字段 —> 属性

ORM的优点:

  1. 易用性:使用ORM做数据库的开发可以有效的减少SQL语句,写出来的模型也更加直观
  2. 性能损耗小
  3. 设计灵活:可以轻松写出来复杂的查询
  4. 可移植性:SQLAlchemy封装了底层的数据库实现,支持多个关系型数据库,包括MySQL,SQLite

模型、数据库、ORM的关系:

image.png

3、通过SQLALchemy创建数据表

现在通过ORM来操作数据库,首先要创建一个类来与对应的表进行映射。
一个小列子:
在my_sql数据库中,创建sheet1数据表,并且拥有以下字段:
1、id:数据类型为整数型,主键,自增
2、name:数据为字符串类型,字符长度不超过5,不可以为空
3、gender:数据类型为整数型,默认值为1,备注部分为”1为男,0为女”
image.png
代码部分:

  1. from sqlalchemy import create_engine
  2. from sqlalchemy import Column, Integer,String
  3. from sqlalchemy.ext.declarative import declarative_base
  4. HOSTNAME = "127.0.0.1"
  5. DATABASE = "my_sql"
  6. PORT = 3306
  7. USERNAME = "root"
  8. PASSWORD = "147258"
  9. # 创建数据库引擎
  10. MS_PD = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}"
  11. engine = create_engine(MS_PD)
  12. # 都要继承这个函数生成的基类
  13. Base = declarative_base(engine)
  14. # ORM操作数据库
  15. class MySheet(Base):
  16. # 定义表的名字
  17. __tablename__ = 'sheet1'
  18. # 定义一些字段
  19. id = Column(Integer, primary_key=True, autoincrement=True)
  20. name = Column(String(50), nullable=False)
  21. gender = Column(Integer, default=1, comment="1为男0为女")
  22. # 将模型映射到对应的数据库
  23. Base.metadata.create_all()

相关代码说明:
在python中设置字段的类型与在SQL中的设置是不一样的,其中的python中的Integer就是SQL中的Int,String表示的是varchat,这些需要从sqlalchemy中进行导入

  1. from sqlalchemy import Column, Integer,String

设置继承的基类,通过导入的declarative_base进行操作
(from sqlalchemy.ext.declarative import declarative_base)

  1. Base = declarative_base(engine)

定义表的名字,需要对tablename字段进行命名

  1. __tablename__ = 'sheet1'

定义字段的相关要求:

  1. id = Column(Integer, primary_key=True, autoincrement=True)
  2. name = Column(String(5), nullable=False)
  3. gender = Column(Integer, default=1, comment="1为男0为女")

其中:

  • primary_key=True:设置为主键
  • autoincrement=True:设置为自增
  • String(5):设置字符长度(必须要给),最长不超过255
  • nullable=False:不允许为空
  • default:默认值
  • comment:备注

映射至数据库中:

  1. Base.metadata.create_all()