目前,我的数据库中有一个表,其中包含id,name(str)和data(int)列。有一个html单选按钮表单,其中选择一个按钮将1添加到数据库中的相应条目:
length_table=session.query(func.count(Item.id)).scalar()
randoms=random.sample(range(length_table),2)
item1=session.query(Item).filter_by(id=randoms[0]+1).one()
item2=session.query(Item).filter_by(id=randoms[1]+1).one()
if request.POST.get('myradiobutton') == "left":
item1.data+=1
return HTTPFound(location=request.route_url('sorting'))
if request.POST.get('myradiobutton') == "right":
item2.data+=1
return HTTPFound(location=request.route_url('sorting'))
这有效,但它有一些劣质的行为(有时会添加到正确的项目,有时会添加到错误的项目)。因为我使用pyramid_tm来处理提交。 SQL日志给了我:
SELECT rowid, * FROM items ORDER BY rowid;
SELECT name, sql FROM sqlite_master WHERE type='table' ;
PRAGMA TABLE_INFO(items);
SELECT name, sql FROM sqlite_master WHERE type='index'
没有对我来说很奇怪的更新声明。如果发布非数据库,如何更新数据库?我相信更新应该发生在transaction.commit()行上。
以下是表格定义:
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
name = Column(Text, unique=True)
data = Column(Integer)
def __init__(self, name, data):
self.name = name
self.data = data
这就是创建引擎的地方:
def main(argv=sys.argv):
if len(argv) != 2:
usage(argv)
config_uri = argv[1]
setup_logging(config_uri)
settings = get_appsettings(config_uri)
engine = engine_from_config(settings, 'sqlalchemy.')
DBSession.configure(bind=engine)
Base.metadata.create_all(engine)
答案 0 :(得分:2)
我不完全确定你item1
和item2
的来源,但我假设你在发布逻辑之前将它们初始化,如:
item1 = DBSession.query(Item).filter(Item.id == passed_value).first()
如果没有,那么item1
和item2
是什么?
无论如何,假设你已经拥有一个有效的item1
对象并想要更新它,并且你正在使用ZopeTransactionExtension,我最终会做这样的事情:
if request.POST.get('myradiobutton') == "left":
item1.data+=1
DBSession.add(item1)
DBSession.flush()
return HTTPFound(location=request.route_url('sorting'))
答案 1 :(得分:0)
但是当它到达行item1.data+=1
时,它会尝试再次随机查询item1。这意味着无论输出是什么(向右或向左),它都会再次从数据库中随机选择一个项目以添加1。又名不一致的结果。
为了解决这个问题,我不得不将我的代码分成GET和POST案例,如下所示。基本上我在最初加载页面时在GET方法中创建了两个随机“键”。然后我将密钥传递给模板
if request.method == "GET":
length_table=session.query(func.count(Item.id)).scalar()
randoms=random.sample(range(1,length_table+1),2)
results = session.query(Item).filter(Item.id.in_(randoms)).all()
return {'randoms':randoms,'item1':randoms[0],'item2':randoms[1],'results':results}
然后在模板上我将这些键值放入用户提交为隐藏值的表单中
<input type="hidden" name="item1" value=${item1}>
<input type="hidden" name="item2" value=${item2}>
最后,在POST部分,我拉入这些值。这意味着它们不是重新随机化的,而是与查询原始项目的键值相同。
if request.method == "POST":
key1=request.params['item1']
key2=request.params['item2']
randoms=[key1,key2]
results = session.query(Item).filter(Item.id.in_(randoms)).all()
if output == "left":
results[0].data=results[0].data+1
return HTTPFound(location=request.route_url('sorting'))
if output == "right":
results[1].data=results[1].data+1
return HTTPFound(location=request.route_url('sorting'))