sqlalchemy的对象性描述声明

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

如何在这个Base上加一些公共的属性,比如 _tablebame_ 前缀等。

使用 as_declarative 的用法

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):
    # ...

但有个问题是 declared_attr 没有生效。

排查后的原因发现是 MyMappedClass 中声明了__tablename__,优先级比基类里的高,就直接使用了,删掉MyMappedClass里面的__tablename__就OK了。

思考一个问题,如果能从class名中推算出表名,是否就不需要用户自己去设置表名了。是的。