Python 数据属性在 SQLAlchemy 模型中的使用

1 投票
2 回答
2373 浏览
提问于 2025-04-16 02:25

我在使用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

撰写回答