SQLAlchemy学习-6.Column 设置字段一些参数配置
2022/7/17 2:15:07
本文主要是介绍SQLAlchemy学习-6.Column 设置字段一些参数配置,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前言
Column 对应表里面的每个字段
Column常用参数
第一个参数传数据类型,sqlalchemy常用数据类型:
参数 | 类型 |
---|---|
String | 字符类型,使用时需要指定长度,区别于Text类型 |
Text | 文本类型 |
LONGTEXT | 长文本类型 |
Integer | 整形 |
Float | 浮点类型 |
Boolean | 传递True/False |
Decimal | 具有小数点而且数值确定的数值 |
Enum | 枚举类型 |
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')
这篇关于SQLAlchemy学习-6.Column 设置字段一些参数配置的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享