SQLAlchemy技巧

SQLAlchemy 是为 Python 编程语言提供的开源 SQL 工具包及对象关系映射器,在关系型数据管理中有广泛应用。该文是包括了一些使用过程中的一些总结经验。包括了以下相关内容

  • 添加日期自动更新的 triger
  • Decimal 控制数据不一致

1. 日期自动更新

在创建数据库时,某些事务发生更新需要同步更新时间戳。在创建 Table 时,SQLAlchemy 默认是没有让日期发生自动更新。因此在使用更新时需要调整参数,可以使用 sqlalchemy 中的 func 模块中日期处理方法。具体的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sqlalchemy
import datetime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import func

# declarative Base
Base = declarative_base()


class TempItem(Base):
"""外源信息临时表
外源信息临时表,用于存储需要影视信息种子源。表名是 `series_temp`,schema 信息可以通过`douban_series.sql` 文件中确认
"""
__tablename__ = "series_temp"
id = sqlalchemy.Column(sqlalchemy.BigInteger, primary_key=True, autoincrement=True)
series_id = sqlalchemy.Column(sqlalchemy.VARCHAR(length=20, convert_unicode=True), nullable=False, unique=True)
title = sqlalchemy.Column(sqlalchemy.VARCHAR(150, convert_unicode=True, collation="utf8mb4"), nullable=False)
main_tag = sqlalchemy.Column(sqlalchemy.VARCHAR(10, convert_unicode=True, collation="utf8mb4"), nullable=True)
status = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False)
create_time = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=func.now())
update_time = sqlalchemy.Column(sqlalchemy.DateTime, nullable=False, server_default=func.now(), onupdate=func.now())

def __repr__(self):
format = "<Data Model Object: %s at %s>"
return format % (self.__class__.__tablename__, hex(id(self)))

def __str__(self):
string = f"Item data:\n\t ID: {self.id} Series_ID: {self.series_id}" + \
f" Title: {self.title} Status: {self.status}"
return string

另一种方法是直接将 使用 Column 中 default 参数是调整为 default=datetime.datetime.now,注意使用传入的是一个方法,而非实际值(未加括号)

2. 解决数据写入读取一致

在写入数据时可能出现 123.456789,但存储到数据库以及读取数据时变为 123.457。该问题主要时因为数据精度的问题,常规来说数据类型可以使用 Double 替换 Float 方式解决,但也会带来数据占据位数增加的问题。推荐使用定点类型(DECIMAL),DECIMAL 有两个参数,第一个参数用于指定一共多少位数,第二个参数用于指定小数点后最多多少位数。DECIMAL(4,2) 表示一共存储4位数字,小数点后最多有两位

作者

ZenRay

发布于

2021-04-19

更新于

2021-04-19

许可协议

CC BY-NC-SA 4.0