我在sqlalchemy模型中遇到了python类属性与数据属性的问题。这是一个展示正在发生的事情的小例子:
# -*- coding: utf-8 -*-
import cherrypy
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('mysql://USER:PASS@localhost/SCHEMA?charset=utf8', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String, nullable=False)
name = Column(String, nullable=False)
email = Column(String, nullable=False)
def __init__(self, username, name, email):
self.username = username
self.name = name
self.email = email
self.data_attribute = "my data attribute"
print "__init__"
def __repr__(self):
print "__repr__"
return "<User('%s','%s', '%s')>" % (self.username, self.name, self.email)
class Root(object):
@cherrypy.expose
def test(self):
our_user = session.query(User).one()
return our_user.data_attribute #error
if __name__ == '__main__':
cherrypy.tree.mount(Root())
cherrypy.server.quickstart()
cherrypy.engine.start()
该代码错误,因为从数据库__init__
中取出对象时不会运行,因此data_attribute
不存在。如果我将data_attribute
放入Column
对象,则变为类属性(我认为),因此User
的所有实例都带有相同的值。这不是我想要的。
我需要做什么才能在我的User对象上拥有一个数据属性,该属性不是来自数据库,但对User
的每个实例都是唯一的?
编辑:我应该指出data_attribute
并不总是只是__init__
中设置的简单字符串 - 这只是为了证明问题。
答案 0 :(得分:2)
SQLAlchemy为此类案例http://docs.sqlalchemy.org/en/latest/orm/constructors.html?highlight=object%20initialization
提供了特殊语法答案 1 :(得分:1)
您应该使用super()来调用基类构造函数:
def __init__(self, username, name, email, *args, **kwargs ):
super( User, self ).__init__( *args, **kwargs ) # Python 2.x or 3.x
#super().__init__( *args, **kwargs ) # Python 3.x only
self.username = username
...