programing

플라스크-SQL 연금술 행 정보 업데이트

stoneblock 2023. 6. 18. 10:10

플라스크-SQL 연금술 행 정보 업데이트

행 정보를 업데이트하려면 어떻게 해야 합니까?

예를 들어 ID가 5인 행의 이름 열을 변경하려고 합니다.

Flask-SQ에 표시된 자습서를 사용하여 개체 검색화학 문서입니다.변경할 엔티티가 있으면 엔티티 자체를 변경합니다.그리고나서,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()

플라스크-SQLAlchemy는 SQLlchemy를 기반으로 하므로 SQLlchemy Docs도 확인하십시오.

방법이 있습니다.updateSQLAlchemy의 BaseQuery 개체에서 반환되는 값filter_by.

num_rows_updated = User.query.filter_by(username='admin').update(dict(email='my_new_email@example.com')))
db.session.commit()

사용의 이점update엔티티를 과도하게 변경하는 것은 업데이트할 개체가 많을 때 발생합니다.

당신이 주고 싶다면,add_user모든 것에 대한 허가admins,

rows_changed = User.query.filter_by(role='admin').update(dict(permission='add_user'))
db.session.commit()

주의:filter_by키워드 인수 사용(하나만 사용)=와는 반대로filter표현이 필요합니다.

모형의 절임 속성을 수정하는 경우에는 이 작업이 수행되지 않습니다.업데이트를 트리거하려면 피클된 특성을 교체해야 합니다.

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}

JSON 및 Picked 특성을 제외한 모든 데이터 유형에 대해 값을 할당하고 커밋하기만 하면 됩니다.절임 타입은 위에 설명되어 있으므로 JSON을 업데이트하는 약간 다르지만 쉬운 방법을 적어 두겠습니다.

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)
    data = db.Column(db.JSON)

def __init__(self, name, data):
    self.name = name
    self.data = data

모델이 위와 같다고 가정해 보겠습니다.

user = User("Jon Dove", {"country":"Sri Lanka"})
db.session.add(user)
db.session.flush()
db.session.commit()

{"country": "Sriranka"} 데이터가 있는 MySQL 데이터베이스에 사용자를 추가합니다.

데이터 수정은 무시됩니다.작동하지 않은 제 코드는 다음과 같습니다.

user = User.query().filter(User.name=='Jon Dove')
data = user.data
data["province"] = "south"
user.data = data
db.session.merge(user)
db.session.flush()
db.session.commit()

JSON을 새로운 딕트에 복사하는 고통스러운 작업(위와 같이 새로운 변수에 할당하지 않음)을 거치는 대신에, 저는 그것을 하는 간단한 방법을 찾았습니다.JSON이 변경한 시스템에 플래그를 표시하는 방법이 있습니다.

다음은 작업 코드입니다.

from sqlalchemy.orm.attributes import flag_modified
user = User.query().filter(User.name=='Jon Dove')
data = user.data
data["province"] = "south"
user.data = data
flag_modified(user, "data")
db.session.merge(user)
db.session.flush()
db.session.commit()

이것은 매력적으로 작용했습니다.여기 이 방법과 함께 제안된 다른 방법이 있습니다. 제가 누군가를 도왔길 바랍니다.

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

저는 @Ramesh의 대답(좋았지만)보다 조금 덜 거슬리는 것을 찾고 있었습니다.DB에 업데이트 방법을 첨부하는 솔루션입니다.모델 개체.

사전을 전달하면 전달한 열만 업데이트됩니다.

class SampleObject(db.Model):
  id = db.Column(db.BigInteger, primary_key=True)
  name = db.Column(db.String(128), nullable=False)
  notes = db.Column(db.Text, nullable=False)

  def update(self, update_dictionary: dict):
    for col_name in self.__table__.columns.keys():
      if col_name in update_dictionary:
        setattr(self, col_name, update_dictionary[col_name])

    db.session.add(self)
    db.session.commit()

그러면 당신이 할 수 있는 길에서.

object = SampleObject.query.where(SampleObject.id == id).first()
object.update(update_dictionary=request.get_json())

플라스크의 열 업데이트

admin = User.query.filter_by(username='admin').first()
admin.email = 'my_new_email@example.com'
admin.save()

용방법을 update메소드(세션 외부에서 항목을 업데이트함)는 다음과 같은 단계에서 개체를 쿼리해야 합니다.

query = db.session.query(UserModel)
query = query.filter(UserModel.id == user_id)
query.update(user_dumped)
db.session.commit()

언급URL : https://stackoverflow.com/questions/6699360/flask-sqlalchemy-update-a-rows-information