分享这几天遇到的两个问题和解决办法,希望对大家有帮助。
1、计算两个日期之间的月数
2、PostgreSQL的jsonb类型数据的null值读写处理
计算两个日期之间的月数
from datetime import datetime def month_count(start_date_string: str, end_date_string: str, include_end: bool = True) -> int: """ 计算两个日期之间的月数 :param start_date_string: 起始年月 "2018-02" :param end_date_string: 终止年月 "2019-04" :param include_end: 是否左右闭合,即包含终止年月所在的最后一个月 :return: 两者之间的月数 int """ start_year = datetime.strptime(start_date_string, "%Y-%m").year end_year = datetime.strptime(end_date_string, "%Y-%m").year start_month = datetime.strptime(start_date_string, "%Y-%m").month end_month = datetime.strptime(end_date_string, "%Y-%m").month nums = (start_year - end_year) * 12 + (start_month - end_month) if include_end: return abs(nums) + 1 return abs(nums) if __name__ == "__main__": print("2016年7月到2017年5月(含)共有{}个月".format(month_count('2016-07', '2017-05'))) print("2016年7月到2017年5月(不含)共有{}个月".format(month_count('2016-07', '2017-05', include_end=False)))
输出
2016年7月到2017年5月(含)共有11个月 2016年7月到2017年5月(不含)共有10个月
PostgreSQL数据库JSONB模型类的注意点
背景
在PostgreSQL数据库中有个表的某个字段为JSONB类型,然后使用sqlacodegen自动生成模型类,以便在数据库中进行操作。(想了解sqlacodegen如何自动生成模型类,请点击阅读原文)
生成的模型类
class JsonbTable(Base): __tablename__ = 'jsonb_table' errors = Column(JSONB()) id = Column(Integer, primary_key=True, autoincrement=True)
出现的问题
当我读取某一行的JSONB类型的值(其值为null)写入到新的行的时候,写入的缺失“null”字符串,而并非是数据库中的null。
数据库中现有的数据:
插入数据
# 读取原有的数据,插入新行 if __name__ == "__main__": with flask_app.app_context(): results = {} for column in db.query(JsonbTable).all(): db.add(JsonbTable(errors=column.errors)) db.commit()
读取原来的null数据插入后:
原因
如果不对jsonb类型的数据设置none_as_null=True,会默认把Python中的None的值写入jsonb类型时会把None转换成json 的null编码即“null”字符串。
if True, persist the value None as a SQL NULL value, not the JSON encoding of null.
修改模型参数
class JsonbTable(Base): __tablename__ = 'jsonb_table' errors = Column(JSONB(none_as_null=True)) id = Column(Integer, autoincrement=True, primary_key=True)
重新插值
再运行一次脚本,数据库中为null的值仍是null,而不是json字符串“null”。