【发布时间】:2013-10-31 22:30:46
【问题描述】:
目前我的数据库中有一个表,其中包含 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)
【问题讨论】:
-
我不明白:您正在通过随机生成的数字进行过滤,并且想知道为什么您的代码具有非确定性行为。但是我对代码的理解还不够深入,无法准确地评论发生了什么。
-
是的,很奇怪。我试过stackoverflow.com/questions/19507467/…,但你可以读到我为什么改变它
-
只需输出您正在运行的查询即可查看您发送到数据库的实际 SQL。然后将该查询与数据库中的数据进行比较。答案很明显
-
我不太擅长 SQL 语句。我已将 SQL 日志附加到问题中。也许这说明了为什么它不能正常工作?
-
@BigBoy1337:你能试着把这个问题(和未来的问题)分解得更多吗?即使您对 SQL 很陌生,您至少应该能够通过添加一些打印来测试以确保表单为视图函数获取正确的值。如果这不起作用,请修复它。如果该部分确实有效,则使用“拉两条记录并增加其中一条”的代码,并将此逻辑放入其自己的函数中。然后,就该功能提出您的 StackOverflow 问题。然后,您(和我们)可以专注于您尝试使用 SQLAlchemy 做什么。
标签: python sqlite sqlalchemy pyramid