如何在sqlite数据库中编辑该列的数据

rkkpypqq  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(182)

我在数据库中有一个CustomerOrders表,它有一个orders列,存储用户的订单,首先这是我的表和我用于orders列的数据类型(我遵循教程)

class JsonEncodedDict(db.TypeDecorator):
    impl = db.Text

    def process_bind_param(self, value, dialect):
        if value is None:
            return '{}'
        else:
            return json.dumps(value)

    def process_result_value(self, value, dialect):
        if value is None:
            return {}
        else:
            return json.loads(value)

class CustomerOrder(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    invoice = db.Column(db.String(20), unique=True, nullable=False)
    status = db.Column(db.String(20), default='Pending', nullable=False)

    customer_id = db.Column(db.Integer, db.ForeignKey(
        'customers.id'), nullable=False)
    customer = db.relationship('Customers', back_populates='orders')

    date = db.Column(db.DateTime, default=datetime.utcnow, nullable=False)
    orders = db.Column(JsonEncodedDict)

并且如何按顺序存储数据的示例如下所示:

{"1": {"file": null, "image": "fd42dbf4212ddfd8c76b.png", "name": "p1", "price": "6.00", "quantity": "3"}, 
"2": {"file": null, "image": "52556d918e2e490032c0.jpg", "name": "p2", "price": "3.00", "quantity": "3"}}

在我的例子中,客户支付订单后,他可以为每个产品上传一个文件,我想在保存后将orders中的file更新为上传的文件名,但我面临一个问题,数据库中的数据不会更新,并且保持不变,我尝试使用以下方法:

@app.route('/upload_file/<int:code>', methods=['POST', 'GET'])
@login_required
def upload_file(code):
    if request.method == 'POST':
        file = request.files.get('order_file')
        invoice = request.args.get('invoice')
        order = CustomerOrder.query.filter_by(invoice=invoice).first()
        try:
            file_name = secrets.token_hex(10) + '.pdf'
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_name))
            data = {}
            for key, item in order.orders.items():
                existing_data = item
                if int(key) == code:
                    existing_data['file'] = file_name
                    data[str(key)] = existing_data
                    order.orders = data
                    db.session.commit()
                    flash(
                        f'{item["name"]}\'s file has been uploaded.', 'success')
                    return redirect(url_for('orders'))
        except Exception as e:
            print(e)
            return redirect(url_for('orders'))

在此代码中,数据库中的orders被更新,但仅更新到具有上传文件的产品,因此如果订单在为其中一个上传文件后有3个项目,则订单现在只有1个项目,因此我将代码修改为:

try:
            file_name = secrets.token_hex(10) + '.pdf'
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_name))
            data = {}
            for key, item in order.orders.items():
                existing_data = item
                if int(key) == code:
                    existing_data['file'] = file_name
                data[str(key)] = existing_data
                order.orders = data
            db.session.commit()
            flash(
                        f'{item["name"]}\'s file has been uploaded.', 'success')
            return redirect(url_for('orders'))

但是现在数据库根本没有改变,它保持不变,我已经试着解决它2天了,什么都不起作用,想过改变我在数据库中存储orders的整个方式,但是如果我这样做,我也需要改变很多东西,所以我在做之前在这里做最后一次尝试。

j13ufse2

j13ufse21#

请储存,而订单作为表没有它,你会有麻烦,无论如何在功能。
如果没有!我的建议是你可以保存它而不使用for循环,就像这样:

file_name = secrets.token_hex(10) + '.pdf'
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_name))
    order = CustomerOrder.query.filter_by(invoice=invoice).first()
    order.orders[str(key)]['file'] = file_name
    db.session.commit()

相关问题