首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQLAlchemy学习-6.Column 设置字段一些参数配置

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

作者头像
上海-悠悠
发布2022-07-19 12:47:43
2.2K0
发布2022-07-19 12:47:43
举报

前言

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)

那么这里Column 用到3个参数

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

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

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

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

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

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

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

其中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"<User(id={self.id}, name={self.name}, " \
               f"tel={self.tel}, tel={self.age})>"

if __name__ == '__main__':
    DB_URI = 'mysql+pymysql://root:123456@localhost:3306/web'
    engine = create_engine(DB_URI)
    Base.metadata.create_all(engine)  # 将模型映射到数据库中

执行后,在数据库中生成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()  # 提交到数据库

如果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)

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

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

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

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

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

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

重复添加相同的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)

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

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

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

obj1 = User(name='yoyo2', tel='10088', age=22)
# 或 age 为 纯数字字符串 
obj2 = User(name='yoyo2', tel='10089', age='22')

2022年第 11 期《python接口web自动化+测试开发》课程,6月5号开学

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Column常用参数
  • 使用示例
  • 新增数据
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档