Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 如何正确使用棉花糖在Mysql上插入新数据?_Python_Mysql_Many To Many_Flask Sqlalchemy_Marshmallow - Fatal编程技术网

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

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

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

一次拍卖有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'),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,如果有任何更大的问题