【发布时间】:2016-12-25 15:15:44
【问题描述】:
我的 Flask-Restful Web 服务器有一个名为 mashrecipies 的字典列表。
mashrecipies = [
{
'id': 1,
'name': 'Kölsch',
'description': 'Top fermented ale from Köln'
},
{
'id': 2,
'name': 'IPA',
'description': 'Classic British Imperial Pale Ale'
},
]
我可以通过 Http PUT 服务从网络客户端成功更新字典。
我还可以使用 SQLAlchemy ORM 通过类 Mash 使用 SQLite DB 中的记录填充列表 mashrecipies。
Base = declarative_base()
class Mash(Base):
__tablename__ = 'mash'
id = Column(Integer, primary_key=True)
selected = Column(Boolean)
name = Column(String)
type = Column(String)
description = Column(String)
def __repr__(self):
return '<{id}, {selected}, {name}, {type}, {desc}>'\
.format(id=self.id, selected=self.selected, name=self.name, type=self.type, desc=self.description)
class Db():
engine = create_engine(SQLALCHEMY_DATABASE_URI)
Session = sessionmaker(bind=engine)
session = Session()
def get_mashrecipies(self,):
mashrecipies.clear()
rec = None
for rec in self.session.query(Mash).order_by(Mash.id):
mashrecipies.append(rec)
但是,如果我使用 SQLAlchemy 填写了列表,然后尝试通过相同的 Http PUT 更新列表内容,我现在会收到错误:
文件 "/Users/xxx/PycharmProjects/AleSheep/server/apis/mashrecipesapi.py", 第 81 行,在 mashrecipe = [mashrecipies 中 mashrecipe 的 mashrecipe ['id'] == id] TypeError: 'Mash' object is not subscriptable
我的 Flask-Restful 资源中的 put 处理程序是:
def put(self, id):
mashrecipe = [mashrecipe for mashrecipe in mashrecipies if mashrecipe['id'] == id]
mashrecipies 和 Mash 之间的唯一显式链接(在我的代码中)是当我通过直接附加 SQLAlchemy 查询中的记录从 Mash 填充 mashrecipies 时。
如果我不做mashrecipies.append(rec),而是将字段复制到字典中,然后附加字典:
dict = {'id': rec.id, 'name': rec.name, 'description': rec.description}
mashrecipies.append(dict)
然后我的 PUT 服务再次正常工作。这解决了我眼前的问题。
但是用从 SQLAlchemy 查询中复制的字段的字典填充列表(OK)和直接附加从查询返回的记录(NOT OK)有什么区别?
SQLAlchemy 是否跟踪查询记录的更改,也许是为了持久化它们?
【问题讨论】:
标签: python dictionary sqlalchemy