如何正确使用棉花糖在Mysql上插入新数据?

问题描述

我将描述一个小的数据库结构:

一个拍卖有N个拍卖,一个物品可以参加N个拍卖。因此,我们遇到了很多情况,正在寻找我的代码

Auction.py

from . import db,Base

itens = db.Table('auction_itens',db.Column('item_id',db.Integer,db.ForeignKey('item.id'),primary_key=True),db.Column('auction_id',db.ForeignKey('auction.id'),primary_key=True)
)

class Auction(Base):
    name = db.Column(db.String(255),nullable=False)
    itens = db.relationship('Item',secondary=itens,lazy='subquery',backref=db.backref('auctions',lazy=True))

Item.py

from . import db,Base

class Item(Base):
    name = db.Column(db.String(255),nullable=False)

这将创建以下结构:

enter image description here

这是我的期望,但是我的问题是在帖子上插入新数据库。因此,让我们看一下我的Schema和我的帖子以插入数据。

auctions_serializer.py

from .. import ma
from ..auctions import Auction
from .itens_serializer import ItemSchema
from marshmallow import fields

class AuctionSchema(ma.sqlAlchemyAutoSchema):
    class Meta:
        model = Auction
        include_relationships = True
        load_instance = True
        include_fk = True

    itens = fields.nested(ItemSchema,many=True)

itens_serializer.py

from .. import ma
from ..itens import Item


class ItemSchema(ma.sqlAlchemyAutoSchema):
    class Meta:
        model = Item
        include_relationships = True
        load_instance = True

我的发布路线:

@bp_auctions.route('/auctions',methods=['POST'])
def postAuctions():  
    auction_schema = AuctionSchema()
    auction = auction_schema.load(request.json)
    current_app.db.session.add(auction)
    current_app.db.session.commit()
    return_msg =  auction_schema.jsonify(auction)

    return return_msg,return_code

如果此代码收到带有以下JSON的帖子,则效果很好:

{
  "name": "test","itens": ["item_one","item_two"]
}

在这种情况下,代码将创建一个拍卖行,在项目中创建两行,在Auction_item中创建两行,这很完美,但是如果我再次发送该帖子,序列化程序将不会搜索“ item_one”和“ item_two”是否已存在”,它将在项目表上创建另一行,因此在这种情况下,我的项目表将有4行,但有2个重复的项目。我的疑问是:

在基于json创建新项目之前,如何强制棉花糖在数据库搜索?有办法吗?

解决方法

我已经设法解决了这个问题,但是它看起来并不是最佳/最干净的解决方案:

@bp_auctions.route('/auctions',methods=['POST'])
def postAuctions():  
    auction_schema = AuctionSchema()
    itens_request = request.json.pop("itens")
    auction = auction_schema.load(request.json)

    itens_schema = ItemSchema()
    for item in itens_request:
        result = Item.query.filter_by(name=item["name"]).first()
        if result is not None:
            auction.itens.append(result)
        else:
            item = itens_schema.load(item)
            auction.itens.append(item)
            
    current_app.db.session.add(auction)
    current_app.db.session.commit()
    return_msg =  auction_schema.jsonify(auction)

    return return_msg,return_code

此解决方案的问题是:对于每个带有X个项目的请求,将在数据库中进行X个选择。

IDK,如果有更大的问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...