【问题标题】:sqlalchemy: column_prefix causes issues accessing model attributessqlalchemy:column_prefix 导致访问模型属性的问题
【发布时间】:2013-03-19 17:07:31
【问题描述】:

我在没有结果的情况下进行了搜索,以从通过 sqlalchemy 创建的对象模型中获取整数值或布尔值,

我的意思是我可以添加它,它可以完美运行,但我无法获得整数值或布尔值,当我尝试打印它时得到的只是对象名称:

from sqlalchemy import create_engine, MetaData, Table, Column,Integer,String,Boolean,Sequence
from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import json
class Bookmarks(object):
    pass
#----------------------------------------------------------------------
engine = create_engine('postgresql://u:p@localghost/asd', echo=True)
Base = declarative_base()

class Tramo(Base):
    __tablename__ = 'tramos'
    __mapper_args__ = {'column_prefix':'tramos'}

    id = Column(Integer, primary_key=True)
    nombre = Column(String)
    tramo_data = Column(String)
    estado = Column(Boolean,default=True)

    def __init__(self,nombre,tramo_data):
        self.nombre=nombre
        self.tramo_data=tramo_data

    def __repr__(self):
        return "[id:%s][nombre:%s][tramo:%s]" % (getattr(self, 'id'),     self.nombre,self.tramo_data)

Session = sessionmaker(bind=engine)
session = Session()

tabla = Tramo.__table__
metadata = Base.metadata
metadata.create_all(engine)

b=Tramo('tramo1','adadas')

session.add(b)
session.commit()
print b
print b.id

它的印记

[id:tramos.id][nombre:tramo1][tramo:adadas]
tramos.id

我无法打印 id 值,看起来对象列在其中,但它没有返回属性的值

我什至会使用

session.refresh(b)

添加之后结果是一样的。

【问题讨论】:

  • 你试过 print int(b.id)
  • 这就是我得到的——TypeError: int() argument must be a string or a number, not 'Column'
  • 看起来前缀用于对象名称而不是对象的 ddl 端。
  • 您为什么使用getattr(self, 'id') 而不仅仅是self.id?您在提交对象后打印 id,因此将填充其 id 属性。

标签: python sqlalchemy


【解决方案1】:

根据文档Naming All Columns with a Prefix

...ma​​pped 属性名称的前缀,相对于 (table) 列名...

由于您在类中定义了映射属性,我认为它不会满足您的要求。

解决方案 1: 从您的 __mapper_args__ 中删除 'column_prefix':'tramos'

Solution-2: print b.tramosid 将打印其 ID。您需要相应地更改__repr__

def __repr__(self):
    return "[id:%s][nombre:%s][tramo:%s]" % (getattr(self, 'tramosid'), self.nombre, self.tramo_data)

【讨论】:

  • 谢谢我已经注意到了,但我不想回复自己。再次感谢你
  • @Freaktor:谢谢,但是如果您找到了适合您的解决方案,您应该发布它。这是鼓励并会帮助其他人。
  • 我没有立即发布它,因为我不得不等待,当我(第二天)回来时,您发布了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
相关资源
最近更新 更多