sqlalchemy中的python继承
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了sqlalchemy中的python继承,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3988字,纯文字阅读大概需要6分钟。
内容图文
![sqlalchemy中的python继承](/upload/InfoBanner/zyjiaocheng/910/ce64ff1012e44f34be97f18329b21173.jpg)
所以我是这个python和sqlalchemy的新手.我需要一些继承的帮助,或者可能是mixin(而是继承).
我有一些psudo代码,但我没有取得任何进展到任何地方:
Base = declarative_base()
class ModelBase(Base):
"""Base model that only defines last_updated"""
__tablename__ = 'doesnotexistandtheclassshouldnotbeinstantiated'
#all tables inheriting from ModelBase will have this column
last_updated = Column(DateTime)
def __init__(self, last_updated):
self.last_updated = last_updated
class User(ModelBase):
"""Defines the user but should also have the last_updated inherited from ModelBase"""
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
def __init__(self, ....):
ModelBase.__init__(last_updated)
我希望从ModelBase继承的所有表也都有last_updated.我该怎么办?
更新的代码:
class BaseUserMixin(object):
"""Base mixin for models using stamped data"""
@declared_attr
def last_updated(cls):
return Column(DateTime)
@declared_attr
def last_updated_by(cls):
return Column(String)
def __init__(self, last_updated, last_updated_by):
self.last_updated = last_updated
self.last_updated_by = last_updated_by
Base = declarative_base(cls=BaseUserMixin)
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
fullname = Column(String)
password = Column(String)
enabled = Column(Boolean)
def __init__(self, name, fullname, password, email, last_updated, last_updated_by):
self.name = name
self.fullname = fullname
self.password = password
self.email = email
# goes wrong here
super(User, self).__init__(last_updated, last_updated_by)
def __repr__(self):
return "<User('%', '%', '%', '%', '%', '%')>"\
% (self.name,
self.fullname,
self.password,
self.email,
self.last_updated,
self.last_updated_by
)
错误是:
_declarative_constructor() takes exactly 1 argument (3 given)
可能是什么问题?我认为它工作正常但是当重新运行调试器时它失败了.
解决方法:
解决方案是declared_attr;它将在出现时随时调用并添加到DeclarativeMeta的实例中:
编辑:声明式自动提供的__init__不能调用super().如果你想要它,它必须是最后的,唯一的方法是使用常规mixin.
import datetime
from sqlalchemy import Column, DateTime, Integer, String
from sqlalchemy.ext.declarative import declared_attr, declarative_base
class BaseMixin(object):
@declared_attr
def last_updated(cls):
return Column(DateTime)
def __init__(self, last_updated, *args, **kwargs):
super(BaseMixin, self).__init__(last_updated=datetime.datetime.now(), *args, **kwargs)
print "BaseMixin.__init__"
self.last_updated = last_updated
ModelBase = declarative_base()
请注意,mixin必须先出现!
class User(BaseMixin, ModelBase):
"""Defines the user but should also have the last_updated inherited from ModelBase"""
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String)
def __init__(self, *args, **kwargs):
super(User, self).__init__(last_updated=datetime.datetime.now(), *args, **kwargs)
print "User.__init__"
if __name__ == '__main__':
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///:memory:', echo=True)
ModelBase.metadata.create_all(engine)
user = User(username='alice')
Session = sessionmaker(engine)
session = Session()
session.add(user)
session.commit()
然而;你确定首先想要使用__init__吗?从查询返回对象时不调用__init__;而你真正想要的是当它被修改时,列立即改变.那已经进入了Column():
from sqlalchemy import func
class BaseMixin(object):
@declared_attr
def created_date(cls):
return Column(DateTime, default=func.now())
@declared_attr
def modified_date(cls):
return Column(DateTime, default=func.now(), onupdate=func.now())
回到使用cls =参数
ModelBase = declarative_base(cls=BaseMixin)
class User(ModelBase):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String)
if __name__ == '__main__':
engine = create_engine('sqlite:///:memory:', echo=True)
ModelBase.metadata.create_all(engine)
user = User(username='alice')
Session = sessionmaker(engine)
session = Session()
session.add(user)
session.commit()
session = Session()
sameuser = session.query(User).one()
sameuser.username = 'bob'
session.commit()
内容总结
以上是互联网集市为您收集整理的sqlalchemy中的python继承全部内容,希望文章能够帮你解决sqlalchemy中的python继承所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。