行の情報を更新するにはどうすればよいですか?
たとえば、ID 5 を持つ行の名前列を変更したいと思います。
Flask-SQLAlchemy ドキュメント に示されているチュートリアルを使用してオブジェクトを取得します。変更するエンティティを取得したら、エンティティ自体を変更します。次に、db.session.commit()
.
例えば:
admin = User.query.filter_by(username='admin').first()
admin.email = 'my_new_email@example.com'
db.session.commit()
user = User.query.get(5)
user.name = 'New Name'
db.session.commit()
Flask-SQLAlchemy は SQLAlchemy に基づいているため、 SQLAlchemy のドキュメントも確認してください。
update
によって返される SQLAlchemy の BaseQuery オブジェクトに対するメソッドがありますfilter_by
。
num_rows_updated = User.query.filter_by(username='admin').update(dict(email='my_new_email@example.com')))
db.session.commit()
エンティティを変更するよりも使用する利点は、update
更新するオブジェクトが多数ある場合に得られます。
すべてのs にadd_user
許可を与えたい場合は、admin
rows_changed = User.query.filter_by(role='admin').update(dict(permission='add_user'))
db.session.commit()
filter_by
式を取るのではなく、はキーワード引数を取る (1 つのみを使用する=
)ことに注意してくださいfilter
。
モデルの pickled 属性を変更すると、これは機能しません。更新をトリガーするには、pickled 属性を置き換える必要があります。
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from pprint import pprint
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqllite:////tmp/users.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
data = db.Column(db.PickleType())
def __init__(self, name, data):
self.name = name
self.data = data
def __repr__(self):
return '<User %r>' % self.username
db.create_all()
# Create a user.
bob = User('Bob', {})
db.session.add(bob)
db.session.commit()
# Retrieve the row by its name.
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {}
# Modifying data is ignored.
bob.data['foo'] = 123
db.session.commit()
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {}
# Replacing data is respected.
bob.data = {'bar': 321}
db.session.commit()
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {'bar': 321}
# Modifying data is ignored.
bob.data['moo'] = 789
db.session.commit()
bob = User.query.filter_by(name='Bob').first()
pprint(bob.data) # {'bar': 321}
Models.py はシリアライザーを定義します
def default(o):
if isinstance(o, (date, datetime)):
return o.isoformat()
def get_model_columns(instance,exclude=[]):
columns=instance.__table__.columns.keys()
columns=list(set(columns)-set(exclude))
return columns
class User(db.Model):
__tablename__='user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
.......
####
def serializers(self):
cols = get_model_columns(self)
dict_val = {}
for c in cols:
dict_val[c] = getattr(self, c)
return json.loads(json.dumps(dict_val,default=default))
RestApi では、json データを更新クエリに渡すことで、レコードを動的に更新できます。
class UpdateUserDetails(Resource):
@auth_token_required
def post(self):
json_data = request.get_json()
user_id = current_user.id
try:
instance = User.query.filter(User.id==user_id)
data=instance.update(dict(json_data))
db.session.commit()
updateddata=instance.first()
msg={"msg":"User details updated successfully","data":updateddata.serializers()}
code=200
except Exception as e:
print(e)
msg = {"msg": "Failed to update the userdetails! please contact your administartor."}
code=500
return msg