我试图在SQLAlchemy中更新记录(行)。我一直在关注这个问题中的解释:How to update SQLAlchemy row entry?这看起来非常简单,但是对我来说不合适。
关注这个问题:Update an object after session.commit() in SQLAlchemy,我也使用了expire_on_commit=False
,但无济于事。
此问题解决了添加记录而不是修改记录的问题:A Flask-SQLAlchemy update is creating a new record in MySQL。此问题涉及将记录从一个表移动到另一个表:Replace existing records in SQLAlchemy Core。这两个问题都没有解决我的问题。
首先我从数据库中提取记录:
>>>first_record = db.session.query(LPRRank).get(1)
然后我在我的会话中检查它:
>>>first_record
M. Misty || None || 1
一切看起来都不错,所以我输入了缺失字段的值:
>>>first_record.riding = 'South Riding'
再次检查记录:
>>>first_record
M. Misty || South Riding || 1
我喜欢我看到的内容,因此我将其提交到数据库:
>>>db.session.commit()
显然,我错过了一些东西,因为现在我失去了骑行的价值:
>>>first_record
M. Misty || None || 1
即使我做了另一个查询,我也输了我输入的值:
>>>first_record = db.session.query(LPRRank).get(1)
>>>first_record
M. Misty || None || 1
即使我使用expire_on_commit=False
>>>first_record = db.session.query(LPRRank).get(1)
>>>first_record
M. Misty || None || 1
>>>first_record.riding = 'South Riding'
>>>first_record
M. Misty || South Riding || 1
>>>expire_on_commit=False <--------- right here
>>>db.session.commit()
>>>first_record = db.session.query(LPRRank).get(1)
>>>first_record
M. Misty || None || 1
所以我的问题: 如何永久更改数据库需要做什么?
这是我正在使用的模型:
class LPRRank(db.Model):
id = db.Column(db.Integer, primary_key=True)
candid = db.Column(db.String(40), index=True, unique=False)
riding = db.Column(db.String(50), index=True, unique=False)
rank = db.Column(db.Integer, index=True, unique=False)
def __repr__(self):
return '{} || {} || {}'.format(self.candid, self.riding, self.rank)
我如何从主模块构建会话:
from app import db
from app.models import LPRRank
def make_shell_context():
return {'db': db, 'LPRRank': LPRRank}
和我的__init__.py
文件:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from app import routes, models