Python 数据属性在 SQLAlchemy 模型中的使用
我在使用Python的SQLAlchemy模型时,遇到了类属性和数据属性之间的问题。下面是一个小例子来说明发生了什么:
# -*- 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__
中设置的简单字符串——这只是为了演示问题。
2 个回答
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
...
3
SQLAlchemy为这种情况提供了特别的语法,详细信息可以查看这个链接:http://docs.sqlalchemy.org/en/latest/orm/constructors.html?highlight=object%20initialization