Python 如何正确使用棉花糖在Mysql上插入新数据?
我将描述一个小型数据库结构: 一次拍卖有N个项目,一个项目可以在N次拍卖中。所以我们有一个多对多的情况,寻找我的代码: 拍卖行Python 如何正确使用棉花糖在Mysql上插入新数据?,python,mysql,many-to-many,flask-sqlalchemy,marshmallow,Python,Mysql,Many To Many,Flask Sqlalchemy,Marshmallow,我将描述一个小型数据库结构: 一次拍卖有N个项目,一个项目可以在N次拍卖中。所以我们有一个多对多的情况,寻找我的代码: 拍卖行 来自。导入数据库,基本 itens=db.Table('auction_itens', db.Column('item_id',db.Integer,db.ForeignKey('item.id'),primary_key=True), db.Column('auction_id',db.Integer,db.ForeignKey('auction.id'),prima
来自。导入数据库,基本
itens=db.Table('auction_itens',
db.Column('item_id',db.Integer,db.ForeignKey('item.id'),primary_key=True),
db.Column('auction_id',db.Integer,db.ForeignKey('auction.id'),primary_key=True)
)
类别拍卖(基本):
name=db.Column(db.String(255),null=False)
itens=db.relationship('Item',secondary=itens,lazy='subquery',
backref=db.backref('auctions',lazy=True))
Item.py
来自。导入数据库,基本
类别项目(基本):
name=db.Column(db.String(255),null=False)
这将创建以下结构:
这正是我所期望的,但我的问题是在帖子中插入新的数据库。因此,让我们看看我的模式和我的文章,以插入数据
U序列化程序.py
from。。进口ma
从…拍卖进口拍卖
从.itens\u序列化程序导入ItemSchema
从棉花糖进口领域
类AuctionSchema(ma.SQLAlchemyAutoSchema):
类元:
模型=拍卖
包含关系=真
load_实例=True
include_fk=True
itens=fields.Nested(ItemSchema,many=True)
itens_serializer.py
from。。进口ma
从..itens导入项目
类ItemSchema(ma.SQLAlchemyAutoSchema):
类元:
型号=项目
包含关系=真
load_实例=True
我的邮寄路线:
@bp_auctions.route('/auctions',methods=['POST'])
def postactions():
拍卖模式=拍卖模式()
auction=auction\u schema.load(request.json)
当前应用程序db.session.add(拍卖)
当前_app.db.session.commit()
return\u msg=auction\u schema.jsonify(auction)
返回消息,返回代码
如果此代码接收到带有以下JSON的帖子,则效果非常好:
{
"name": "test",
"itens": ["item_one", "item_two"]
}
在这种情况下,代码将创建一个拍卖行、两行item和两行auction\u item,这是完美的,但是如果我再次发送帖子,序列化程序将不会搜索item表上是否已经存在“item\u one”和“item\u two”,它将在item表上创建另一行,因此在这种情况下,我的item表将有4行,但是有两个重复的ITEN。我的疑问是:
在基于json创建新项目之前,如何强制marshmallow在DB上搜索?有什么办法可以做到这一点吗?我已经设法解决了这个问题,但它看起来不是最佳/最干净的解决方案:
@bp_auctions.route('/auctions',methods=['POST'])
def postactions():
拍卖模式=拍卖模式()
itens_request=request.json.pop(“itens”)
auction=auction\u schema.load(request.json)
itens_schema=ItemSchema()
对于itens\U请求中的项目:
result=Item.query.filter_by(name=Item[“name”])。first()
如果结果不是无:
auction.itens.append(结果)
其他:
item=itens\u schema.load(item)
拍卖.itens.append(项目)
当前应用程序db.session.add(拍卖)
当前_app.db.session.commit()
return\u msg=auction\u schema.jsonify(auction)
返回消息,返回代码
此解决方案的问题是:对于每个包含X个项目的请求,将在数据库上进行X个选择
IDK,如果有任何更大的问题