Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlite3数据库上表单提交的sqlalchemy行更新行为不一致_Python_Sqlite_Sqlalchemy_Pyramid - Fatal编程技术网

Python sqlite3数据库上表单提交的sqlalchemy行更新行为不一致

Python sqlite3数据库上表单提交的sqlalchemy行更新行为不一致,python,sqlite,sqlalchemy,pyramid,Python,Sqlite,Sqlalchemy,Pyramid,目前,我的数据库中有一个表,其中包含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=ses

目前,我的数据库中有一个表,其中包含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'))
这是可行的,但它有一些劣质行为(有时添加到正确的项目,有时添加到错误的项目)。因为我正在使用它来处理提交。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)

我不完全确定您的
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'))

好吧,这就是问题所在。当我第一次调用item1和item2时,它会用随机数表示的随机整数随机查询数据库

但是当它到达行
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}>

我不明白:您正在通过随机生成的数字进行过滤,并且想知道为什么您的代码具有非确定性行为。但我对代码的理解还不够透彻,无法对到底发生了什么进行评论。是的,这很奇怪。我试过了,但您可以理解我为什么要更改它,只需输出您正在运行的查询,以查看您发送到数据库的实际SQL。然后将该查询与数据库中的数据进行比较。答案很明显,我对SQL语句不是很在行。我已将SQL日志附加到该问题。也许这说明了它为什么不能正常工作?@BigBoy1337:你能试着把这个问题(以及未来的问题)进一步细分吗?即使您对SQL不太了解,您至少应该能够通过添加一些打印来进行测试,以确保表单获得了视图函数的正确值。如果这不起作用,修复它。如果该部分确实起作用,那么使用“提取两条记录并递增其中一条记录”的代码,并将此逻辑放入其自身的函数中。然后,提出有关该函数的问题。然后,您(和我们)可以将重点放在如何使用SQLAlchemy上。在刷新提交更改之前,我应该将该项添加到数据库会话中是有意义的。但是,您的解决方案似乎无法解决问题。因为我使用的是金字塔框架,所以我听说我需要使用transaction.commit(),尽管我不完全理解为什么。此外,我已将项目定义添加到问题中,以便您可以看到它们。谢谢!我对Pyramid也比较陌生,但我认为只有在不使用ZopeTransactionExtension的情况下才需要transaction.commit();我几乎所有的东西都是基于。类似于模型声明中的
DBSession=scoped_会话(sessionmaker(extension=ZopeTransactionExtension())
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'))