定制 Django ORM / SQLAlchemy ORM 的 BaseModel

本文介绍如何在Django和SQLAlchemy ORM框架中创建自定义基类Model,通过抽象类实现公共字段如create_time和update_time的复用,减少代码冗余。

起因

在具体项目中,一般 ORM 框架提供给我们的 Model 父类无法满足我们的要求,这时有很大动力来定制属于项目的 Model 父类。比如希望每个 Entity 都有 create_time/update_time 这几个属性,或定制其他行为,而不是在每个 Entity 里面手写对应的重复的代码。

How to do:Django ORM

Django ORM 提供了丰富的功能,因此达到这个目的很简单。只需要在 BaseModel 中提供 abstract 关键字即可。

代码如下:

from django.db import models


class BaseModel(models.Model):
    create_time = models.IntegerField(db_index=True)
    update_time = models.IntegerField(db_index=True)

    class Meta:
        abstract = True


class SomeEntity(BaseModel):
    name = models.CharField(max_length=1000)
    address = models.CharField(max_length=1000, default='')
    info = models.CharField(max_length=2000, default='')
复制代码

How to do: SQLAlchemy ORM

SQLAlchemy 是另一款使用广泛的 ORM 框架,达到这个目的也十分简单(只不过查文档比较费力 )。

代码如下:

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

_Base = declarative_base(bind=sa.create_engine())


class BaseModel(_Base):
    __abstract__ = True  # 主要是这一句起作用

    # 定制基本属性
    id = sa.Column(sa.Integer, nullable=False, primary_key=True, unique=True)
    create_time = sa.Column(sa.Integer, nullable=False, index=True)
    update_time = sa.Column(sa.Integer, nullable=False, index=True)
复制代码
### PostgreSQL 中的 ORM 工具及其使用 在 PostgreSQL 数据库环境中,ORM(对象关系映射)工具可以显著简化数据库操作流程。以下是几种常用的 PostgreSQL 支持的 ORM 工具以及它们的特点: #### 1. SQLAlchemy SQLAlchemyPython 社区中最受欢迎的 ORM 工具之一。它提供了高度灵活的对象关系映射功能,并支持多种数据库后端,包括 PostgreSQL。 - **安装**: 使用 `pip` 安装 SQLAlchemy 和 psycopg2 驱动程序。 ```bash pip install sqlalchemy psycopg2-binary ``` - **连接配置**: 创建引擎并定义模型类以便与 PostgreSQL 表交互[^1]。 ```python from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker engine = create_engine('postgresql+psycopg2://user:password@localhost/mydatabase') Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50)) age = Column(Integer) Session = sessionmaker(bind=engine) session = Session() ``` - **CRUD 操作**: 添加新记录到表中。 ```python new_user = User(name="Alice", age=30) session.add(new_user) session.commit() ``` #### 2. Django ORM 如果项目基于 Django 开发,则可以直接利用其内置的 ORM 功能来管理 PostgreSQL 数据库中的数据。 - **设置数据库**: 修改项目的 `settings.py` 文件以指定 PostgreSQL 连接参数。 ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'myuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '', } } ``` - **迁移命令**: 执行以下命令创建或更新数据库结构。 ```bash python manage.py makemigrations python manage.py migrate ``` #### 3. Tortoise ORM Tortoise ORM 提供了一个异步友好的接口,适合用于现代 Web 应用开发场景下的 PostgreSQL 数据库访问。 - **安装**: ```bash pip install tortoise-orm asyncpg ``` - **基本用法**: 初始化 ORM 并执行查询操作。 ```python from tortoise.models import Model from tortoise import fields, run_async, Tortoise class User(Model): id = fields.IntField(pk=True) name = fields.CharField(max_length=50) age = fields.IntField() await Tortoise.init( db_url='postgres://user:password@localhost/mydatabase', modules={'models': ['__main__']} ) user = await User.create(name="Bob", age=25) users = await User.filter(age__gt=20).all() ``` #### 4. Peewee Peewee 是另一个轻量级但强大的 ORM 解决方案,适用于中小型应用的需求。 - **初始化**: 设置 PostgreSQL 数据源并与之建立联系。 ```python from peewee import PostgresqlDatabase, Model, CharField, IntegerField database = PostgresqlDatabase('mydatabase', user='myuser', password='mypassword', host='localhost') class BaseModel(Model): class Meta: database = database class User(BaseModel): name = CharField(max_length=50) age = IntegerField() ``` - **运行迁移**: 构建表格并通过脚本完成同步过程。 ```python database.connect() database.create_tables([User]) ``` --- ### 性能优化建议 对于高并发环境或者大数据集处理的应用来说,除了选择合适的 ORM 外还需要考虑性能调优策略。例如采用 Agrona 或者 Disruptor 等高性能计算框架辅助实现更高效的内存管理和线程间通信机制[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值