0%

【sqlalchemy】自定义映射表的元类

sqlalchemy自定义映射表的元类有两种方式:函数declarative_baseas_declarative装饰器

  • 通过继承DeclarativeMeta元类,在使用declarative_base函数时传递给metaclass参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from sqlalchemy import Column, Integer, Text, create_engine
from sqlalchemy.ext.declarative import declarative_base, DeclarativeMeta

class BaseTableMetaclass(DeclarativeMeta):

def __init__(cls, classname: str, bases, dict_, **kw: object) -> None:
# 自动生成表名的设置
setattr(cls, "__tablename__", classname.lower())
# 添加通用的表字段
setattr(cls, "id", Column(Integer, primary_key=True, autoincrement=True))
super(BaseTableMetaclass, cls).__init__(classname, bases, dict_, **kw)


Base = declarative_base(metaclass=BaseTableMetaclass)


class TbTest(Base):
status = Column(Integer)
note = Column(Text)
  • 定义一个类并使用as_declarative装饰器,使之成为表映射类的元类

以下是官方文档的示例:

1
2
3
4
5
6
7
8
9
10
11
from sqlalchemy.ext.declarative import as_declarative

@as_declarative()
class Base(object):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
id = Column(Integer, primary_key=True)

class MyMappedClass(Base):
# ...

对比两种方式,as_declarative装饰器的方式更加直观,代码易读性会高一些