You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Peewee创建按日期(月份)分区的数据库表?

在Peewee中按日期月份创建分区表的实现方法

一、创建表时直接添加分区规则

以PostgreSQL为例(主流支持分区的数据库之一),你可以通过模型Meta类的constraints字段声明主表的分区规则,再通过Peewee的DDL类追加分区创建语句:

from peewee import *
from playhouse.postgres_ext import PostgresqlExtDatabase

# 初始化数据库连接
db = PostgresqlExtDatabase('your_db_name', user='postgres', password='your_pwd')

class BaseModel(Model):
    class Meta:
        database = db

# 定义带日期字段的模型
class BusinessLog(BaseModel):
    id = BigAutoField(primary_key=True)
    operation = TextField()
    create_time = DateTimeField()

    class Meta:
        table_name = 'business_log'
        # 声明主表按create_time字段的范围分区
        constraints = [SQL('PARTITION BY RANGE (create_time)')]

# 定义创建月份分区的DDL语句
create_month_partitions = DDL("""
-- 创建2024年1月的分区
CREATE TABLE business_log_202401 PARTITION OF business_log
    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');

-- 创建2024年2月的分区
CREATE TABLE business_log_202402 PARTITION OF business_log
    FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
""")

# 原子操作:先创建主表,再创建分区
with db.atomic():
    db.create_tables([BusinessLog])
    create_month_partitions.execute(db)

核心逻辑:

  1. 在模型Meta的constraints中加入分区规则,让主表创建时自带分区属性。
  2. 用DDL类封装分区创建的原生SQL,在主表创建完成后执行,生成对应月份的分区表。

二、Schema创建完成后动态添加分区

完全支持后续添加分区,只要主表已经声明了分区规则,随时可以执行新的分区创建语句。比如后续要新增2024年3月的分区:

# 定义新增3月分区的DDL
add_march_partition = DDL("""
CREATE TABLE business_log_202403 PARTITION OF business_log
    FOR VALUES FROM ('2024-03-01') TO ('2024-04-01');
""")

# 执行分区创建
add_march_partition.execute(db)

这种方式适合做定时任务,比如每月自动创建下一个月的分区,不需要改动主表结构。

注意事项

  • 不同数据库的分区语法略有差异:比如MySQL需要用TO_DAYS()函数转换日期,分区语句为PARTITION BY RANGE (TO_DAYS(create_time)),分区范围写VALUES LESS THAN (TO_DAYS('2024-02-01')),需要根据你使用的数据库调整DDL。
  • 确保数据库版本支持分区功能(如PostgreSQL 10+、MySQL 8.0+)。
  • 用Peewee的SQL类可以灵活插入原生SQL片段,避免硬编码整个表结构,适配不同场景的分区需求。

内容的提问来源于stack exchange,提问作者SkyWalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:47:27