атрибуты данных python в модели sqlalchemy

1

Я сталкиваюсь с проблемами с атрибутами класса 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__ - это просто демонстрация проблемы.

Теги:
sqlalchemy

2 ответа

2
Лучший ответ

SQLAlchemy предоставляет специальный синтаксис для таких случаев, http://docs.sqlalchemy.org/en/latest/orm/constructors.html?highlight=object%20initialization

  • 0
    легенда. большое Вам спасибо
  • 0
    Ссылка сейчас 404.
Показать ещё 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
    ...
  • 0
    Согласно моему заявлению о печати, User.__init__ никогда не запускается, так как я могу позвонить на базу? есть ли какая-то магия питона, которую я здесь скучаю ??
  • 0
    Я неправильно понял часть вопроса, так что, думаю, это не относится напрямую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню