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名中推算出表名,是否就不需要用户自己去设置表名了。是的。