Python 对象在使用SQL Alchemy提交后发生更改

Python 对象在使用SQL Alchemy提交后发生更改,python,flask,sqlalchemy,flask-sqlalchemy,Python,Flask,Sqlalchemy,Flask Sqlalchemy,也许我在这里遗漏了一些非常简单的东西,但我有一个烧瓶网站,我有一个供人们参加的测试。我的数据库有一个testettempt表,定义如下: 类TestAttempt(db.Model,UserMixin): user\u id=db.Column(db.Integer,db.ForeignKey(user.id,ondelete='CASCADE'),primary\u key=True) 尝试次数=db.Column(db.Integer) 尝试_data=db.Column(db.String

也许我在这里遗漏了一些非常简单的东西,但我有一个烧瓶网站,我有一个供人们参加的测试。我的数据库有一个
testettempt
表,定义如下:

类TestAttempt(db.Model,UserMixin):
user\u id=db.Column(db.Integer,db.ForeignKey(user.id,ondelete='CASCADE'),primary\u key=True)
尝试次数=db.Column(db.Integer)
尝试_data=db.Column(db.String(1000))
时间戳=db.Column(db.String(1000))
分数=分贝列(分贝整数)
开始时间=db.Column(db.String(20))
站点设置为进行前后测试,因此
尝试次数
字段应为
1
2
。我有一个名为
get\u或\u create\u test\u trunt()
的函数,它执行tin上的命令。如果用户已经有打开的尝试,则返回该尝试;否则将创建一个新的。它最初的定义如下:

def获取或创建测试尝试(用户id,尝试id):
trunt=TestAttempt.query.filter\u by(user\u id=user\u id,trunt\u number=trunt\u id).first()
如果尝试==无:
new\u-trunt=TestAttempt(用户\u-id=user\u-id,尝试\u-number=trunt\u-id,开始\u-time=str(datetime.now().strftime(“%m%d%Y%H%m%S”))
db.session.add(新尝试)
db.session.commit()
返回新的\u尝试
其他:
回击尝试
这不起作用:它第一次尝试时没有问题,但每当我提供
2
作为
trunt\u id
时,它总是返回第一次尝试。我添加了一些打印声明,试图确定发生了什么,并讲述了一个故事:

def获取或创建测试尝试(用户id,尝试id):
打印(“请求:”,用户id,尝试id)
trunt=TestAttempt.query.filter\u by(user\u id=user\u id,trunt\u number=trunt\u id).first()
如果尝试==无:
new\u-trunt=TestAttempt(用户\u-id=user\u-id,尝试\u-number=trunt\u-id,开始\u-time=str(datetime.now().strftime(“%m%d%Y%H%m%S”))
打印(“已创建:”,新尝试。用户id,新尝试。尝试编号)
db.session.add(新尝试)
db.session.commit()
打印(“提交后:”,新尝试。用户id,新尝试。尝试编号)
返回新的\u尝试
其他:
回击尝试
当我使用
2
尝试id
1160的
用户id
请求时,我获得了以下输出:

Asked for: 1160 2
Created: 1160 2
After commit: 1160 1
Recieved: 1160 1
注意:我还在函数调用后添加了“received”部分,如下所示:

trunt=get\u或\u create\u test\u尝试(当前用户id,尝试id)
打印(“接收:”,尝试。用户id,尝试。尝试号码)
在绝望中,我尝试为我刚刚创建的对象运行一个新查询,但它显示了相同的行为:

def获取或创建测试尝试(用户id,尝试id):
打印(“请求:”,用户id,尝试id)
trunt=TestAttempt.query.filter\u by(user\u id=user\u id,trunt\u number=trunt\u id).first()
如果尝试==无:
new\u-trunt=TestAttempt(用户\u-id=user\u-id,尝试\u-number=trunt\u-id,开始\u-time=str(datetime.now().strftime(“%m%d%Y%H%m%S”))
打印(“已创建:”,新尝试。用户id,新尝试。尝试编号)
db.session.add(新尝试)
db.session.commit()
打印(“提交后:”,新尝试。用户id,新尝试。尝试编号)
new\u trunt=TestAttempt.query.filter\u by(user\u id=user\u id,trunt\u number=trunt\u id).first()
打印(“在新查询之后:”,新尝试。用户id,新尝试。尝试号码,”\n并输入查询:”,用户id,尝试id)
返回新的\u尝试
其他:
回击尝试
令人困惑的是,输出:

Asked for: 1160 2
Created: 1160 2
After commit: 1160 1
After new query: 1160 1         and query was fed: 1160 2
Recieved: 1160 1
请注意,如果我首先开始后测试,那么这就是“普遍”测试-如果我尝试访问/创建一个
trunt\u number
1
的尝试,它总是给出
trunt\u number
2
的尝试。还要注意的是,即使函数未能返回corect对象,也会创建它,因为我可以在数据库中看到它,并使用正确的参数


我不知道是什么导致了这种行为。欢迎任何输入。

您的
用户id
列是
主键
,您的表中只能有一个用户条目,即您无法使用相同的
用户id提交第二次尝试。您可以尝试从
用户id
尝试编号
列中创建一个复合主键