Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask app中IntegrityError之后数据库中的ID不正常_Python_Postgresql_Flask - Fatal编程技术网

Python Flask app中IntegrityError之后数据库中的ID不正常

Python Flask app中IntegrityError之后数据库中的ID不正常,python,postgresql,flask,Python,Postgresql,Flask,我有以下应用程序: from flask import Flask, render_template, request, flash, jsonify from flask_sqlalchemy import SQLAlchemy from sqlalchemy import exc app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@db:5432/post

我有以下应用程序:

from flask import Flask, render_template, request, flash, jsonify
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import exc

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@db:5432/postgres'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class Product(db.Model):
    __tablename__ = 'store'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    category = db.Column(db.String(120), nullable=False)
    price = db.Column(db.Integer, nullable=False)

    def __init__(self, name, category, price):
        self.name = name
        self.category = category
        self.price = price

@app.route('/store', methods=['GET','POST'])
def add_product():
    if request.method=='GET':
       products = Product.query.all()
       
       results = [
            {
                "name": product.name,
                "category": product.category,
                "price": product.price
            } for product in products]
       return {"count": len(results), "products": results}

    elif request.method=='POST':   
        if request.is_json:
          data = request.get_json()
          new_product = Product(name=data['name'], category=data['category'], price=data['price'])
          db.session.add(new_product)
          db.session.commit()
          return {"message": f"Product {new_product.name} has been created successfully."}
        else:
          return {"error": "The request payload is not in JSON format"}


@app.route('/store/<product_name>', methods=['GET','PUT','DELETE'])
def handle_product(product_name):
    product = Product.query.get_or_404(product_name)
 
    if request.method == 'GET':
      result = {
            "name": product.name,
            "category": product.category,
            "price": product.price
      }
      return {"message": "success", "product": (result)}  

    elif request.method == 'PUT':
        data = request.get_json()
        product.name = data['name']
        product.category = data['category']
        product.price = data['price']
        db.session.add(product)
        db.session.commit()
        return {"message": f"Product {product.name} successfully updated"}

    elif request.method == 'DELETE':
        db.session.delete(product)
        db.session.commit()
        return {"message": f"Product {product.name} successfully deleted."}

if __name__ == '__main__':
    db.init_app(app)
    db.create_all()
    app.run(host='0.0.0.0')
从烧瓶导入烧瓶,呈现模板,请求,闪存,jsonify
从flask_sqlalchemy导入sqlalchemy
从sqlalchemy导入exc
app=烧瓶(名称)
app.config['SQLALCHEMY\u DATABASE\u URI']='postgresql://postgres:postgres@db:5432/博士后'
app.config['SQLALCHEMY\u TRACK\u MODIFICATIONS']=False
db=SQLAlchemy(应用程序)
类别产品(数据库模型):
__tablename_uu='store'
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(80),unique=True,nullable=False)
category=db.Column(db.String(120),nullable=False)
price=db.Column(db.Integer,nullable=False)
定义初始(自身、名称、类别、价格):
self.name=名称
self.category=类别
self.price=价格
@app.route('/store',methods=['GET','POST'])
def add_product():
if request.method==“GET”:
products=Product.query.all()
结果=[
{
“名称”:product.name,
“类别”:产品类别,
“价格”:产品价格
}产品中的产品]
返回{“计数”:len(结果),“产品”:结果}
elif请求。方法=='POST':
如果request.is_json:
data=request.get_json()
新产品=产品(名称=数据['name'],类别=数据['category'],价格=数据['price'])
db.session.add(新产品)
db.session.commit()
返回{“message”:f“产品{new_Product.name}已成功创建。”}
其他:
返回{“error”:“请求负载不是JSON格式”}
@app.route('/store/',方法=['GET','PUT','DELETE'])
def handle_产品(产品名称):
product=product.query.get_或_404(产品名称)
如果request.method==“GET”:
结果={
“名称”:product.name,
“类别”:产品类别,
“价格”:产品价格
}
返回{“消息”:“成功”,“产品”:(结果)}
elif request.method==“PUT”:
data=request.get_json()
product.name=数据['name']
product.category=数据['category']
product.price=数据['price']
db.session.add(产品)
db.session.commit()
返回{“消息”:f“产品{Product.name}已成功更新”}
elif request.method==“DELETE”:
db.session.delete(产品)
db.session.commit()
返回{“消息”:f“产品{Product.name}已成功删除。”}
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
db.init_应用程序(应用程序)
db.create_all()
app.run(host='0.0.0.0')
产品类中的名称设置为唯一值,每次我尝试发布相同的产品名称(作为测试)时,我都会得到IntegrityError,并且留下空ID


然后在表中我有一种情况,一个产品被正确地设置为1个ID,第二个产品被正确地设置为5个ID,并且有3个ID是空的,因为这个整数错误。如何避免表中的产品一个接一个地带有ID?

您是说表中有5条记录,其中三条是空白的?或者您是说有2条记录,但ID不连续?如果是后者,那么一切都好。身份证号码完全不在你的控制范围之内,它们也不重要。第二,它们不是连续的。比如当我尝试卷曲ID 1时,我得到了正确的乘积值,但是当我尝试卷曲ID 2时,却发现“未找到”。你需要处理这个问题。您不能假定数据库分配的ID是连续的、不间断的。也许您需要一个
/store/list
动词来返回现有ID的列表。