gpt4 book ai didi

python - 如何正确使用Marshmallow在Mysql上插入新数据?

转载 作者:行者123 更新时间:2023-12-04 03:57:07 28 4
gpt4 key购买 nike

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

一次拍卖有 N 次,一件元素可以参加 N 次拍卖。所以我们有很多情况,正在寻找我的代码:

拍卖.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.Integer, 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))

项目.py

from . import db, Base

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

这将创建以下结构:

enter image description here

这是我所期望的,但我的问题是在帖子中插入新数据库。因此,让我们查看我的架构和我的帖子以插入数据。

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"]
}

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

在基于 json 创建新项目之前,如何强制 marshmallow 在 DB 上进行搜索?有什么办法吗?

最佳答案

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

@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。

关于python - 如何正确使用Marshmallow在Mysql上插入新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63689523/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com