SQLAlchemy Declarative: добавление статического текстового атрибута в столбец

Я использую: SQLAlchemy 0.7.9 и Python 2.7.3 с Bottle 0.11.4. Я любитель в питоне.

У меня есть класс (со многими столбцами), полученный из декларативной базы следующим образом:

class Base(object):

     @declared_attr
     def __tablename__(cls):
             return cls.__name__.lower()

     id = Column(Integer, primary_key = True)

     def to_dict(self):
             serialized = dict((column_name, getattr(self, column_name))
                     for column_name in self.__table__.c.keys())
             return serialized

Base = declarative_base(cls=Base)


class Case(Base):

     version                 = Column(Integer)
     title                   = Column(String(32))
     plausible_dd            = Column(Text)
     frame                   = Column(Text)
     primary_task            = Column(Text)
     secondary_task          = Column(Text)
     eval_objectives         = Column(Text)
     ...

В настоящее время я использую этот «маршрут» в Bottle для вывода строки/класса в json следующим образом:

@app.route('/<name>/:record')
def default(name, record, db):
    myClass = getattr(sys.modules[__name__], name)
    parms = db.query(myClass).filter(myClass.id == record)
    result = json.dumps(([parm.to_dict() for parm in parms]))
    return result

Мой первый вопрос: как я могу сделать так, чтобы в каждом столбце был некоторый статический текст, который я мог бы использовать в качестве имени собственного, чтобы я мог перебирать столбцы и получать их значения И собственные имена? Например:

class Case(Base):
     version    = Column(Integer)
     version.pn = "Version Number" 

Мой второй вопрос: делает ли следующее то, что я ищу? Я видел примеры этого, но я не понимаю объяснения.

Пример из sqlalchemy.org:

      id = Column("some_table_id", Integer)

Моя интерпретация примера:

      version   = Column("Version Number", Integer)

Очевидно, я не хочу создавать столбец таблицы. Я просто хочу, чтобы столбец имел «атрибут» в общем смысле. Заранее спасибо.


person user3091850    schedule 31.12.2012    source источник
comment
Я только что понял, что у меня может быть строка, содержащая имена собственные. Я все еще заинтересован в том, чтобы увидеть, можно ли использовать эту функциональность в модели.   -  person user3091850    schedule 01.01.2013


Ответы (1)


Для этого можно использовать словарь info. . В вашем классе модели определите его следующим образом:

class Case(Base):
    version = Column(Integer, info={'description': 'Version Number'})

Затем к нему можно получить доступ как к свойству столбца таблицы:

desc = Case.__table__.c.version.info.get('description', '<no description>')

Обновить

Вот один из способов перебрать все столбцы в таблице и получить их имена, значения и описания. В этом примере используется понимание словаря, доступное начиная с Python 2.7.

class Case(Base):
    # Column definitions go here...

    def as_dict(self):
        return {c.name: (getattr(self, c.name), c.info.get('description'))
                for c in self.__table__.c}
person Audrius Kažukauskas    schedule 31.12.2012
comment
Это именно то, что мне нужно. Я пытался, но я не могу понять, как их перебирать и помещать в диктовку. - person user3091850; 01.01.2013
comment
Спасибо за помощь. Все еще привыкаю к ​​Python. :) - person user3091850; 01.01.2013