Python sqlalchemy 数据类型转换

将字符串类型的数据存放到数据库中,是一个很常见的任务。在Python数据库开发中,我们经常使用sqlalchemy定义数据模型。多数情况下,不管模型中定义的数据类型是什么,我们都可以直接将字符串赋值给各字段,然后sqlalchemy会帮我们进行转换。 有时候,我们也需要自己做类型转换。比如,我们希望获得数据记录的变动情况,就需要比较输入字符串类型的数据和从数据库中查询到的数据记录。类型不一致,就不能准确地比较。本文介绍的类型转换方法,是基于模型定义中的数据类型,以及它们与Python类型的对应关系而实现的。

数据类型是很多的。本文只介绍最常见的需要转换的类型,即日期和数值。

数据例子

数据例子包含一个sqlalchemy 数据模型定义 和 一个输入数据。我们需要把全部是字符串类型的输入数据, 根据模型进行字段类型转换。

数据模型

class Project(Base):
        __tablename__ = 'project'
        id = Column(Integer, primary_key=True)
        project_name = Column(String)
        due_date = Column(Date)
        cost = Column(Numeric(13,2))

上述模型中,我们定义了一个项目模型Project,主要数据字段有项目名称,结束日期,和成本。

输入数据

sample_project = {
        'project_name': 'Space Magic',
        'due_date': '2020-3-3',
        'cost': '99980.34'
}

获取字段类型

根据模型获得对应的字段,以及其数据类型定义。

import sqlalchemy as sa
# print sqlalchemy data types.
for f in sample_project.keys():
        c = getattr(Project, f)
        sa_type = c.type
        print('Field %s, Type: %s', f, sa_type)

根据 sqlalchemy 文档 data type basics, 能得到对应的数据类型列表。其中日期类型Date对应 datetime.date, 数字类型 Numeric 默认对应 decimal.Decimal。

类型转换

if isinstance(sa_type, sa.Date):
        converted_value = datetime.strptime(old_value, '%Y-%m-%d')
elif isinstance(sa_type, sa.Numeric):
        converted_value = decimal.Decimal(old_value)

字符串转为日期

字符串转换为日期或日期时间,都可以使用函数 datetime.strptime (strptime = string parse to time)。最常用的日期格式是类似于2017-5-29 或 2017-05-29这样的,都可以通过格式%Y-%m-%d进行解析。

字符串转为数值

对于数据库中定义为Decimal或Numeric类型的字段,对应到Python中为Decimal类型。Decimal能接受字符串输入。因此其转换很简单。