【问题标题】:SQLAlchemy Declarative: Adding a static text attribute to a columnSQLAlchemy 声明式:向列添加静态文本属性
【发布时间】:2013-01-01 19:20:47
【问题描述】:

我正在使用:SQLAlchemy 0.7.9 和 Python 2.7.3 和 Bottle 0.11.4。我是python的业余爱好者。

我有一个类(有很多列)从这样的声明性基础派生:

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)

显然我不想创建表格列。我只是希望该列具有一般意义上的“属性”。提前谢谢你。

【问题讨论】:

  • 我刚刚意识到我可以有一个包含专有名称的行。不过,我仍然有兴趣看看该功能是否可以放入模型中。

标签: python sqlalchemy bottle


【解决方案1】:

info 字典可以用于此。在你的模型类中这样定义它:

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

那么就可以作为表格列属性访问了:

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

更新

这是遍历表中所有列并获取它们的名称、值和描述的一种方法。此示例使用 dict 理解,它从 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}

【讨论】:

  • 这正是我所需要的。我一直在尝试,但我不知道如何迭代它们并将它们放入字典中。
  • 感谢您的帮助。还是习惯了 Python。 :)
猜你喜欢
  • 2016-10-06
  • 2011-10-24
  • 1970-01-01
  • 2017-07-06
  • 2015-02-13
  • 2015-02-24
  • 2017-03-23
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多