• SQLAlchemy学习-6.Column 设置字段一些参数配置


    前言

    Column 对应表里面的每个字段

    Column常用参数

    第一个参数传数据类型,sqlalchemy常用数据类型:

    参数类型
    String字符类型,使用时需要指定长度,区别于Text类型
    Text文本类型
    LONGTEXT长文本类型
    Integer整形
    Float浮点类型
    Boolean传递True/False
    Decimal具有小数点而且数值确定的数值
    Enum枚举类型
    DateTime日期时间类型
    Date传递datetime.date()进去
    Time传递datatime.time()

    针对字段的一些参数设置

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

    使用示例

    设计一张User 表,我们一般会把id设置为主键,并且设置自增类型,如

    id = Column(Integer, primary_key=True, autoincrement=True)
    
    • 1

    那么这里Column 用到3个参数

    • Integer 设置为整形
    • primary_key 设置主键
    • autoincrement 自增

    给User 表加一个name 用户名字段,用户名不能为空,设置nullable=False

    name = Column(String(10), nullable=False)
    
    • 1

    继续给User 表加一个字段tel 手机号,我们希望手机号不能重复,每个人对应唯一手机号,于是设置 unique=True

    tel = Column(String(30), unique=True)
    
    • 1

    还可以加一个age年龄字段,设置默认值0

    age = Column(Integer, name="my_age", default=0)
    
    • 1

    其中name参数是映射数据库表里面的my_age字段

    User 表设计完整代码示例

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
    
    Base = declarative_base()
    
    
    class User(Base):
        """银行卡基本信息"""
        __tablename__ = 'user'  # 数据库表名
    
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(10), nullable=False)
        tel = Column(String(30), unique=True)
        age = Column(Integer, name="my_age", default=0)
    
        def __repr__(self):
            return f""
    
    
    if __name__ == '__main__':
        DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web'
        engine = create_engine(DB_URI)
        Base.metadata.create_all(engine)  # 将模型映射到数据库中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    执行后,在数据库中生成user表

    其中tel是设置的unique

    新增数据

    测试新增数据

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from xuexi.a6 import User
    
    
    engine = create_engine('mysql+pymysql://root:123456@localhost:3306/web')
    # 把当前的引擎绑定给这个会话
    Session = sessionmaker(bind=engine)
    # 实例化
    session = Session()
    
    # 新增数据
    obj = User(tel='10086', age=20)
    session.add(obj)  # 添加到session
    session.commit()  # 提交到数据库
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    如果name字段(nullable=False)不传,会抛出异常:"Column 'name' cannot be null"

    sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1048, "Column 'name' cannot be null")
    [SQL: INSERT INTO user (name, tel, my_age) VALUES (%(name)s, %(tel)s, %(my_age)s)]
    [parameters: {'name': None, 'tel': '10086', 'my_age': 20}]
    (Background on this error at: https://sqlalche.me/e/14/gkpj)
    
    • 1
    • 2
    • 3
    • 4

    name字段(nullable=False)传空字符串也会抛异常

    # 新增数据
    obj = User(name='', tel='10086', age=20)
    session.add(obj)  # 添加到session
    session.commit()  # 提交到数据库
    
    • 1
    • 2
    • 3
    • 4

    给name传一个值,可以添加成功

    # 新增数据
    obj = User(name='yoyo', tel='10086', age=20)
    session.add(obj)  # 添加到session
    session.commit()  # 提交到数据库
    
    • 1
    • 2
    • 3
    • 4

    tel 字段是unique 唯一字段,不能重复添加

    # 新增数据
    obj = User(name='yoyo1', tel='10086', age=20)
    session.add(obj)  # 添加到session
    session.commit()  # 提交到数据库
    
    • 1
    • 2
    • 3
    • 4

    重复添加相同的tel,会抛出异常: 1062, "Duplicate entry '10086' for key 'tel'"

    sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry '10086' for key 'tel'")
    [SQL: INSERT INTO user (name, tel, my_age) VALUES (%(name)s, %(tel)s, %(my_age)s)]
    [parameters: {'name': 'yoyo1', 'tel': '10086', 'my_age': 20}]
    (Background on this error at: https://sqlalche.me/e/14/gkpj)
    
    • 1
    • 2
    • 3
    • 4

    age 如果不传,会给默认值0

    # 新增数据
    obj = User(name='yoyo2', tel='10087')
    session.add(obj)  # 添加到session
    session.commit()  # 提交到数据库
    
    • 1
    • 2
    • 3
    • 4

    age字段设置的是整形,那么age可以设置一个数字,也可以设置纯数字字符串

    obj1 = User(name='yoyo2', tel='10088', age=22)
    # 或 age 为 纯数字字符串 
    obj2 = User(name='yoyo2', tel='10089', age='22')
    
    • 1
    • 2
    • 3
  • 相关阅读:
    面试必考 - 结构体内存对齐,还有人不会?
    表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
    华为云智能化组装式交付方案 ——金融级PaaS业务洞察及Web3实践的卓越贡献
    LCR 164.破解闯关密码(数字---字符)
    GEE学习总结(9)——像元二分法计算月度植被覆盖度(MODIS)
    复旦大学:邮件系统安全运维实用建议
    勇夺2022上半年新势力造车销冠的小鹏汽车有护城河吗?
    Day20_的笔记补充
    前端vuePC端适配手机端最终方案详解(带源码)
    当有人知道你的愿望想帮你实现你会是怎样
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/126440669