常见数据范例与Column参数
常见范例
- Integer:整数范例,对应数据库的 int 范例。
- Float:浮点数范例,对应数据库的 float 范例。它占用 32 位空间。
- Double:双精度浮点数范例,对应数据库的 double 范例,占用 64 位空间。需要留意的是在 SQLAlchemy 中没有 Double 范例。
- String:可变字符范例,对应数据库的 varchar 范例。
- Boolean:布尔范例,对应数据库的 tinyint 范例。
- DECIMAL:定点数范例,主要用于解决浮点数精度题目。在存储与金钱干系的字段时,推荐利用此数据范例。利用时需要传递两个参数,第一个参数表现字段能存储的总位数,第二个参数表现小数点后的位数。
- Enum:罗列范例,限定字段值只能为预设的几个值。在 ORM 模型中,利用 Enum 范例表现罗列。也可以用 Python3 内置的 enum 模块定义字段。
- Date:日期范例,只能存储年代日。对应数据库的 date 范例。在 Python 代码中,可以利用 datetime.date 来指定。
- DateTime:日期时间范例,可以存储年代日时分秒毫秒等。对应数据库的 datetime 范例。在 Python 代码中,可以利用 datetime.datetime 来指定。
- Time:时间范例,可以存储时分秒。对应数据库的 time 范例。在 Python 代码中,可以利用 datetime.time 来指定。
- Text:长字符串范例,一般可以存储凌驾 6 万个字符。如果超出这个范围,可以利用 LONGTEXT 范例。对应数据库的 text 范例。
- LONGTEXT:超长文本范例,对应数据库的 longtext 范例。
常见的 Column 参数
- primary_key:将此字段设置为主键,需要设定值为 True。
- autoincrement:将此字段设置为主动递增,需设定值为 True。
- default:为某个字段设置默认值,常用于如发布时间等字段。
- nullable:确定某个字段是否可以为空。默认值为 True,意味着该字段可以为空。
- unique:确定某个字段的值是否需唯一。默认值为 False。
- onupdate:在更新数据时会调用这个参数指定的值或函数。初次插入数据时,不会利用 onupdate 的值,而是利用 default 的值。这个参数常用于 update_time 字段(每次数据更新时都需更新该字段的值)。
- name:指定 ORM 模型中的某个属性映射到表中的字段名。如果未指定,则会利用该属性的名称作为字段名。如果已指定,则会利用指定的值作为表字段名。该参数也可以作为位置参数,在第一个参数中指定,如:
title = Column(String(50),name='title',nullable=False)
或者
title = Column('my_title',String(50),nullable=False)。
样例实现
- class News(Base):
- __tablename__ = 'news'
- # id 整数类型,限制主键自增
- id = Column(Integer, primary_key=True, autoincrement=True)
- # 标题 长度为 100 字符类型, 不能为空
- title = Column(String(100), nullable=False)
- # 作者电话 字符类型 唯一
- author_telephone = Column(String(11), unique=True, nullable=False)
- # 是否删除 整型,不能为空, 默认为 0
- is_delete = Column(Integer, nullable=False, default=0)
- # 是否公开 布尔类型, 不能为空, 默认为 True
- is_published = Column(Boolean, nullable=False, default=True)
- # 标题1 枚举类型 常规写法
- tag1 = Column(Enum('python', 'java', 'go', 'javascript'))
- # 标题2 枚举类型 另一种写法
- tag2 = Column(Enum(TagEnum))
- # 时间的三种类型
- created_at = Column(Date, default=datetime.datetime.now)
- updated_at = Column(DateTime, onupdate=datetime.datetime.now, default=datetime.datetime.now)
- published_at = Column(Time)
- # 文本的两种类型
- content1 = Column(Text)
- content2 = Column(LONGTEXT)
复制代码 生成的数据库表字段如下:

生成的 SQL 语句如下:
- create table news
- (
- id int auto_increment
- primary key,
- title varchar(100) not null,
- author_telephone varchar(11) not null,
- is_delete int not null,
- is_published tinyint(1) not null,
- tag1 enum ('python', 'java', 'go', 'javascript') null,
- tag2 enum ('python', 'java', 'c', 'javascript', 'cpp') null,
- created_at date null,
- updated_at datetime null,
- published_at time null,
- content1 text null,
- content2 longtext null,
- constraint author_telephone
- unique (author_telephone)
- );
复制代码 测试样例
新增一条数据,并更新干系字段值。
- # 新建一个会话对象
- session = sessionmaker(bind=engine)()
- # 创建一个 new 对象
- new_demo = News(title='测试new',
- author_telephone='15991367893',
- is_delete=0,
- is_published=True,
- tag1='go',
- tag2=TagEnum.c,
- created_at=datetime.datetime.now(),
- updated_at=datetime.datetime.now(),
- published_at=datetime.time(),
- content1='这是一个测试性内容1',
- content2='这是一个测试性内容2')
- # session.add(new_demo)
- # session.commit()
- # session.close()
- # 测试 onupdate 参数
- a_new = session.query(News).first()
- a_new.title = '这是修改后的标题'
- a_new.author_telephone = '15991367894'
- # 提交事物
- session.commit()
- session.close()
复制代码 留意
我们设置了author_telephone此处有些不敷,不能满意正常开发需求,切忌在项目中利用。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |