【SQLAlChemy】常见的数据类型有哪些,Column可选的参数有哪些呢?

常见数据类型与Column参数

常见类型

  1. Integer:整数类型,对应数据库的 int 类型。
  2. Float:浮点数类型,对应数据库的 float 类型。它占用 32 位空间。
  3. Double:双精度浮点数类型,对应数据库的 double 类型,占用 64 位空间。需要注意的是在 SQLAlchemy 中没有 Double 类型。
  4. String:可变字符类型,对应数据库的 varchar 类型。
  5. Boolean:布尔类型,对应数据库的 tinyint 类型。
  6. DECIMAL:定点数类型,主要用于解决浮点数精度问题。在存储与金钱相关的字段时,推荐使用此数据类型。使用时需要传递两个参数,第一个参数表示字段能存储的总位数,第二个参数表示小数点后的位数。
  7. Enum:枚举类型,限制字段值只能为预设的几个值。在 ORM 模型中,使用 Enum 类型表示枚举。也可以用 Python3 内置的 enum 模块定义字段。
  8. Date:日期类型,只能存储年月日。对应数据库的 date 类型。在 Python 代码中,可以使用 datetime.date 来指定。
  9. DateTime:日期时间类型,可以存储年月日时分秒毫秒等。对应数据库的 datetime 类型。在 Python 代码中,可以使用 datetime.datetime 来指定。
  10. Time:时间类型,可以存储时分秒。对应数据库的 time 类型。在 Python 代码中,可以使用 datetime.time 来指定。
  11. Text:长字符串类型,一般可以存储超过 6 万个字符。如果超出这个范围,可以使用 LONGTEXT 类型。对应数据库的 text 类型。
  12. LONGTEXT:超长文本类型,对应数据库的 longtext 类型。

常见的 Column 参数

  1. primary_key:将此字段设置为主键,需要设定值为 True
  2. autoincrement:将此字段设置为自动递增,需设定值为 True
  3. default:为某个字段设置默认值,常用于如发布时间等字段。
  4. nullable:确定某个字段是否可以为空。默认值为 True,意味着该字段可以为空。
  5. unique:确定某个字段的值是否需唯一。默认值为 False
  6. onupdate:在更新数据时会调用这个参数指定的值或函数。初次插入数据时,不会使用 onupdate 的值,而是使用 default 的值。这个参数常用于 update_time 字段(每次数据更新时都需更新该字段的值)。
  7. name:指定 ORM 模型中的某个属性映射到表中的字段名。如果未指定,则会使用该属性的名称作为字段名。如果已指定,则会使用指定的值作为表字段名。该参数也可以作为位置参数,在第一个参数中指定,如:
    title = Column(String(50),name='title',nullable=False)
    或者
    title = Column('my_title',String(50),nullable=False)

样例实现

python 复制代码
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 语句如下:

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)
);

测试样例

新增一条数据,并更新相关字段值。

python 复制代码
# 新建一个会话对象
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此处有些不足,不能满足正常开发需求,切忌在项目中使用。

相关推荐
玉衡子7 分钟前
MySQL基础架构全面解析
数据库·后端
梦中的天之酒壶9 分钟前
Redis Stack扩展功能
数据库·redis·bootstrap
GreatSQL16 分钟前
GreatSQL分页查询优化案例实战
数据库
鲸屿19531 分钟前
python之socket网络编程
开发语言·网络·python
里昆36 分钟前
【AI】Tensorflow在jupyterlab中运行要注意的问题
人工智能·python·tensorflow
AI视觉网奇38 分钟前
pycharm 最新版上一次编辑位置
python
Leo.yuan40 分钟前
不同数据仓库模型有什么不同?企业如何选择适合的数据仓库模型?
大数据·数据库·数据仓库·信息可视化·spark
麦兜*1 小时前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
chat2tomorrow1 小时前
数据采集平台的起源与演进:从ETL到数据复制
大数据·数据库·数据仓库·mysql·低代码·postgresql·etl
2401_828890641 小时前
使用 BERT 实现意图理解和实体识别
人工智能·python·自然语言处理·bert·transformer