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的列表。