169

行の情報を更新するにはどうすればよいですか?

たとえば、ID 5 を持つ行の名前列を変更したいと思います。

4

6 に答える 6

293

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 のドキュメントも確認してください。

于 2011-07-14T23:32:56.140 に答える
114

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

于 2011-10-20T04:16:09.350 に答える
19

モデルの 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}
于 2015-01-13T03:51:13.717 に答える
2

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
于 2020-09-15T12:10:36.100 に答える