【问题标题】:Update a value based on Join FlaskSqlALchemy根据 Join Flask SqlALchemy 更新值
【发布时间】:2022-08-15 08:21:18
【问题描述】:

我在数据库中有 2 个表。

class Vehicle(db.Model):
    __tablename__ = \"vehicles\"

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    num_plate = db.Column(db.String(7), nullable=False, unique=True)
    type = db.Column(db.String, nullable=False)
    suspicious = db.Column(db.Boolean, nullable=False, default=False)

    def __repr__(self) -> str:
        return f\"Vehicle(number playe={self.num_plate}, type={self.type}, suspicious={self.suspicious})\"

class Registered(db.Model):
    \"\"\"
    Registered User
    \"\"\"

    __tablename__ = \"registered\"

    regid = db.Column(db.Integer, primary_key=True, nullable=False)
    name = db.Column(db.String, nullable=False)
    cnic = db.Column(db.String, nullable=False)
    contactno = db.Column(db.String, nullable=False)
    gender = db.Column(db.String, nullable=False)
    dor = db.Column(db.DateTime, nullable=False)
    doe = db.Column(db.DateTime, nullable=False)
    vehicle_id = db.Column(
        db.Integer, db.ForeignKey(\"vehicles.id\"), unique=True, nullable=False
    )

现在我想更新特定人的汽车号码牌。假设有regid 3 的人。

我可以得到他的数据。

reg_visitor = (
    Registered.query.filter_by(regid=3)
    .join(Vehicle)
    .add_columns(
        Registered.name,
        Registered.cnic,
        Registered.contactno,
        Registered.gender,
        Registered.dor,
        Registered.doe,
        Vehicle.num_plate,
        Vehicle.suspicious,
    )
).first()

它是类型

<class \'sqlalchemy.engine.row.Row\'>

如果我打印它的属性,它会给出正确的答案。

print(reg_visitor.num_plate)

输出是

ANB 127

现在如果我想更新这个属性,我不能。

reg_visitor.num_plate = \"ABC1234\"

错误:

    reg_visitor.num_plate = \"ABC1234\"
  File \"/home/ahmad/Desktop/FYP/venv/lib/python3.7/site-packages/sqlalchemy/engine/row.py\", line 219, in __setattr__
    raise AttributeError(\"can\'t set attribute\")
AttributeError: can\'t set attribute

我的 Flask-SQL Alchemy 版本是 \'2.5.1\',SQLAlchemy 版本是 1.4.29。

我不想弄乱我的版本,有没有其他方法可以根据加入更新属性?

不过,它在单张桌子上效果很好。

vehicle = Vehicle.query.filter_by(num_plate=\"ANB 127\").first()
vehicle.num_plate = \"ABC123\"
db.session.commit()
vehicle = Vehicle.query.filter_by(num_plate=\"ABC123\").first() # works well
print(vehicle)

    标签: python database flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    正如您所指出的,查询reg_visitor 的结果是sqlalchemy.engine.row.Row,这意味着它不会映射到单个类。

    当您尝试更新其中的属性时,SQLAlchemy 不知道它如何根据查询更新表。

    您需要直接查询 Vehicle(就像您再次展示的那样)才能进行更新。

    【讨论】:

    • 哦,所以我从第一个查询中得到车牌,并通过第二个查询更新它!我是多么愚蠢,无法弄清楚这一点。
    【解决方案2】:
    1. 将此列添加到您的车辆班级

      registers = db.relationship('Registered', backref='vehicles',lazy='dynamic')

    2. 之后你可以执行

      reg_visitor=db.session.query(Vehicle).join(Registered,Registered.regid==3).one_or_none() reg_visitor.num_plate=2331 db.session.commit()

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      相关资源
      最近更新 更多