1、sqlalchemy数据类型

  • Integer:整形,INT等同于Integer
  • Float:浮点类型。
  • Boolean:传递True/False进去。
  • DECIMAL:定点类型。
  • Enum:枚举类型。
  • Date:传递datetime.date()进去。
  • DateTime:传递datetime.datetime()进去。
  • Time:传递datetime.time()进去。
  • String:字符类型,使用时需要指定长度,区别于Text类型。
  • Text:文本类型。
  • LONGTEXT:长文本类型

Float:浮点类型
注意点:精度问题,只能够保留4位小数(超过的四舍六入五成双),对于精度要求高的可以选择DECIMAL类型
DECIMAL:定点类型
DECIMAL(x, y)参数x表示的输入长度,参数y表示的保留几位小数,如果保留的小数为没有超过设定小数位,则用零进行填充,超过的话
Boolean:传递True/False进去
定义改字段,在数据库中True会体现为1,False会体现为0
Enum:枚举类型
Enum(“xxx”, “yyy”)相当于定义了一个下拉菜单注意采用该类型后只能够你定义的内容之间进行选择,空或者输入其他内容都会报错,如果使用default默认值,也只能在定义中的选
image.png
DateTime(年月日 时分秒),Date(年月日),Time(时分秒)
配合datetime模块使用from datetime import datetime, date, time
以datatime为例:

  1. from sqlalchemy import create_engine
  2. # 不要忘记导入DateTime
  3. from datetime import datetime
  4. from sqlalchemy import Column, Integer, String, DateTime
  5. from sqlalchemy.ext.declarative import declarative_base
  6. from sqlalchemy.orm.session import sessionmaker
  7. HOSTNAME = "127.0.0.1"
  8. DATABASE = "my_sql"
  9. PORT = 3306
  10. USERNAME = "root"
  11. PASSWORD = "147258"
  12. MS_DP = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  13. engine = create_engine(MS_DP)
  14. Base = declarative_base(engine)
  15. class Sheet(Base):
  16. __tablename__ = "sheet3"
  17. id = Column(Integer, primary_key=True, autoincrement=True)
  18. name = Column(String(10), nullable=False)
  19. gender = Column(Integer, default=1, comment="1为男,0为女")
  20. create_time = Column(DateTime)
  21. Base.metadata.create_all()
  22. information = Sheet(name="龚祝俊", gender=0, create_time=datetime(2020, 4, 22, 21, 35, 23))
  23. Session = sessionmaker(bind=engine)
  24. session = Session()
  25. session.add(information)
  26. session.commit()

String:字符类型
需要注意的是需要传递一个长度的参数,String(长度)
Text:文本类型
这个存在一定的长度限制
LONGTEXT:长文本类型
这个需要进行特别的导入,在数据库中可以双击编辑

  1. from sqlalchemy.dialects.mysql import LONGTEXT

2、sqlalchemy常用参数

  • default:默认值。
  • nullable:是否可空。
  • primary_key:是否为主键。
  • unique:是否唯一。
  • autoincrement:是否自动增长。
  • onupdate:更新的时候执行的函数。
  • name:该属性在数据库中的字段映射

nullable:是否可空
nullable = False,不允许为空
unique:是否唯一
写入该参数时,表示该字段中出现的值为具有唯一性,不能够重复。如果重复则报错
onupdate:更新的时候执行的函数
当数据发生更新时,执行自己书写的函数,运用场景为,修改文章,记录修改编辑时间

  1. update_time = Column(DateTime, onupdate=datetime.now())

name:该属性在数据库中的字段映射

  1. name = Column('fullname', String(20))
  2. # name="fullname"可以直接写成"fullname",因为name形参在第一位,在数据库中字段映射的名字就不是"name"
  3. # 而是"fullname"

3、sqlalchemy聚合函数

  • func.count:统计行的数量。
  • func.avg:求平均值。
  • func.max:求最大值。
  • func.min:求最小值。
  • func.sum:求和

以func.count()为例
代码部分:

  1. from sqlalchemy import Column, Integer, String
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.ext.declarative import declarative_base
  4. from sqlalchemy.orm.session import sessionmaker
  5. # 导入func模块
  6. from sqlalchemy import func
  7. HOSTNAME = "127.0.0.1"
  8. DATABASE = "my_sql"
  9. PORT = 3306
  10. USERNAME = "root"
  11. PASSWORD = "147258"
  12. eng = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  13. engine = create_engine(eng)
  14. Base = declarative_base(engine)
  15. class Sheet(Base):
  16. __tablename__ = "sheet4"
  17. id = Column(Integer, primary_key=True, autoincrement=True)
  18. name = Column(String(10), nullable=False)
  19. gender = Column(Integer, default=1, comment="1为男,0为女")
  20. Base.metadata.create_all()
  21. session = sessionmaker(bind=engine)()
  22. # 在最后需要加上first()否则获取到的是原生的sql语句,并且使用count时需要加上某一具体字段
  23. dates = session.query(func.count(Sheet.id)).first()
  24. print(dates)

代码解读:
第一步:导入func模块

  1. from sqlalchemy import func

第二步:

  1. # 在最后需要加上first()否则获取到的是原生的sql语句,并且使用count时需要加上某一具体字段
  2. dates = session.query(func.count(Sheet.id)).first()
  3. print(dates)

注意点:
1、需要写上first()才能读取到所需数据,否则就只是sql原生语句
image.png
该原生代码能够在SQLyog中进行执行(末尾加分号;F9执行)
image.png
看了这个图就知道使用first()的原因了
2、需要传入模型.字段才能够进行执行,否则报错
其余的聚合函数与func.count()用法相似