2012-12-31 64 views
4

我正在使用:SQLAlchemy 0.7.9和Python 2.7.3,瓶0.11.4。我是python的業餘愛好者。SQLAlchemy聲明式:向列添加靜態文本屬性

我有一個類(具有很多列)從聲明鹼的是這樣的:

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) 
    ... 

我目前使用一瓶這樣的「路線」傾倒了一排/類像這樣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" 

我的第二個問題是:以下是否正在尋找我正在尋找的東西?我看過這個例子,但我不明白這個解釋。要創建

 version = Column("Version Number", Integer) 

很顯然,我不想要一個表列:從sqlalchemy.org

例子:

 id = Column("some_table_id", Integer) 

我的例子解釋。我只希望列在泛型意義上具有「屬性」。先謝謝你。

+0

我剛纔意識到我可以有一個包含專有名稱的行。我仍然有興趣看到這個功能是否可以放入模型中。 – user3091850

回答

3

info字典可用於此目的。在你的模型類中定義它是這樣的:

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

然後,它可以作爲表列屬性來訪問:

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

更新

這裏是通過所有迭代的一種方式表格中的列並獲取它們的名稱,值和說明。這個例子使用了自Python 2.7以來的dict理解。

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} 
+0

這正是我所需要的。我一直在嘗試,但我無法弄清楚如何迭代它們並將它們變爲字典。 – user3091850

+0

好吧,我會更新我的答案來演示迭代。 –

+0

感謝您的協助。仍然習慣於Python。 :) – user3091850