- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 flask-sqlalchemy 中正确实现多对多关系遇到了很多麻烦。它从重复的标签开始,现在,很多天后是一个映射问题。公平警告,在这些问题出现之前,我的代码要漂亮得多。我还添加了一个 addproduct.py 文件来加速测试。所以就在这里。
模型.py
1 from app import app, db
2
3 product_tags = db.Table('association',
4 db.Column('product_id', db.Integer, db.ForeignKey('product.id')),
5 db.Column('tag_name', db.Integer, db.ForeignKey('tag.name'))
6 )
7
8 class Product(db.Model):
9 id = db.Column(db.Integer, primary_key=True)
10 title = db.Column(db.String(128))
11 description = db.Column(db.Text)
12 image = db.Column(db.String(64))
13 link = db.Column(db.String(256))
14 price = db.Column(db.Float())
15 timestamp = db.Column(db.DateTime)
16 expiration = db.Column(db.String(6))
17 tags = db.relationship('Tag', secondary=product_tags,
18 backref=db.backref('product', lazy='dynamic'))
19
20 def __init__(self, title, description, image, link, price, timestamp, expiration, tags):
21 self.title = title
22 self.description = description
23 self.image = image
24 self.link = link
25 self.price = price
26 self.timestamp = timestamp
27 self.expiration = expiration
28 self.tags = tags
29 print self.title
30
31 def __repr__(self):
32 return '<Title %r, Description %r, Image %r, Link %r, Price %r, Timestamp %r, Expires %r, Tags %r>' % (self.title, self.description, self.image, sel
33
34 class Tag(db.Model):
35 name = db.Column(db.String(32), primary_key=True)
36
37 def __init__(self, name):
38 self.name = name
39
40 def __repr__(self):
41 return '<Tag %r>' % self.name
添加产品.py
1 from app import db
2 from app.models import Product, Tag, product_tags
3 from datetime import datetime
4
5 imagefolder = 'static/img/'
6
7 title = 'product'
8 description = 'description'
9 image = 'image.jpg'
10 link = 'http://link.com'
11 price = 2000.00
12 expiration = ''
13 tags = ['tag1','tag2']
14
15 newtags = []
16
17 def create_product(title, description, image, link, price, expiration, tags):
18 image = imagefolder + image
19 tag_assoc = []
20 for tag in tags:
21 tagcheck = Tag.query.filter_by(name=tag).first()
22 if tagcheck == None:
23 tag_assoc.append(Tag(tag))
24 else:
25 newtags.append(tag)
26
27 product = Product(title, description, image, link, price, datetime.utcnow(), expiration, tag_assoc)
28 create_assoc(newtags)
29 return product
30
31 def create_assoc(newtags):
32 title_search = Product.query.filter_by(title=title).first()
33 for tag in newtags:
34 assoc = product_tags.insert().values(product_id=title_search.id, tag_name=tag)
35 db.session.add(assoc)
36 db.session.commit()
37
38 if __name__ == '__main__':
39 product = create_product(title, description, image, link, price, expiration, tags)
40 db.session.add(product)
41 db.session.commit()
42 create_assoc(newtags)
我得到的错误信息是:
11:11 ~/shop $ python addproduct.py
product
Traceback (most recent call last):
File "addproduct.py", line 39, in <module>
product = create_product(title, description, image, link, price, expiration, tags)
File "addproduct.py", line 28, in create_product
create_assoc(newtags)
File "addproduct.py", line 35, in create_assoc
db.session.add(assoc)
File "/home/username/.local/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 114, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "/home/username/.local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1358, in add
raise exc.UnmappedInstanceError(instance)
sqlalchemy.orm.exc.UnmappedInstanceError: Class 'sqlalchemy.sql.expression.Insert' is not mapped
这是我的第一个 Web 应用程序,不是直接来自教程,我完全迷路了。请帮忙!
最佳答案
我能看到的第一个错误是在你的模型中——你的关联正确地有两个外键,但是标签的外键是一个 Integer
但你的主键在你的 Tag 中
类是一个 String
——它们应该匹配。除此之外,模型看起来不错。
您还应该能够简化您的 create_product
函数:
def create_product(title, description, image, link, price, expiration, tags):
image = imagefolder + image
tag_list = []
for tag in tags:
tagcheck = Tag.query.filter_by(name=tag).first()
if tagcheck is None:
tag_list.append(Tag(tag))
else:
tag_list.append(tagcheck)
product = Product(title, description, image, link, price, datetime.utcnow(), expiration, tag_list)
return product
这可以很容易地移动到您的 __init___
构造函数中。在您的示例中,您直接处理关联表,但您根本不必这样做——只需相信 ORM 会做正确的事情,这就是 SQLAlchemy 的美妙之处。
这是您的产品模型的示例:
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(128))
description = db.Column(db.Text)
image = db.Column(db.String(64))
link = db.Column(db.String(256))
price = db.Column(db.Float())
timestamp = db.Column(db.DateTime)
expiration = db.Column(db.String(6))
tags = db.relationship('Tag', secondary=product_tags,
backref=db.backref('products', lazy='dynamic'))
def __init__(self, title, description, image, link, price, timestamp, expiration, tags):
self.title = title
self.description = description
self.image = image
self.link = link
self.price = price
self.timestamp = timestamp
self.expiration = expiration
for tag in tags:
tagcheck = Tag.query.filter_by(name=tag).first()
if tagcheck is None:
self.tags.append(Tag(tag))
else:
self.tags.append(tagcheck)
def __repr__(self):
return '<{}, {}>'.format(self.title, ":".join([x.name for x in self.tags]))
为了测试它,首先让我们向系统添加几个标签:
ta = Tag('cat')
tb = Tag('dog')
db.session.add_all([ta, tb])
db.session.commit()
>>> Tag.query.all()
[<Tag u'cat'>, <Tag u'dog'>]
现在让我们添加一个使用这些标签的产品,再加上一个新标签。
p = Product(
'title',
'description',
'image',
'link',
0.0,
datetime.now(),
'expiry',
['dog','cat','horse']
)
db.session.add(p)
db.session.commit()
当我们创建该产品时,构造函数获取这三个字符串标签中的每一个,然后说“嘿,这个名称的标签是否已经存在?”如果是,则使用它,如果不是,则使用该名称创建一个新标签。 SQLAlchemy 足够聪明,知道将新标签添加到 session 中,并在提交产品时提交它。
>>> Tag.query.all()
[<Tag u'cat'>, <Tag u'dog'>, <Tag u'horse'>]
现在让我们找到所有带有 dog 标签的产品(假设添加了更多产品)。
>>> tag = Tag.query.get('dog')
>>> products = tag.products
>>> [x.title for x in products]
['title','other','examples']
再说一次,我根本没有接触关联表,没有必要。 SQLAlchemy 正在为我们省力。
关于python - flask-sqlalchemy 插入未映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274194/
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
已经提出了类似的问题,但由于它总是取决于,我单独询问我的具体情况。 我有一个网站页面,显示来自数据库的一些数据,要从该数据库生成数据,我必须执行一些相当复杂的多连接查询。 数据每天(每晚)更新一次。
我正在使用 MongoDb 和 MySQL 的 python 连接器 pymongo 和 pymysql 测试 MongoDb 和 MySQL,特别是插入功能。 pymongo版本是3.4,pymys
从 C# 应用程序插入大型数组(10M 元素)的最快方法是什么? 到目前为止,我使用的是批量插入。 C# 应用程序生成一个大文本文件,我使用 BULK INSERT 命令加载它。出于好奇,我编写了一个
我编写了一个枚举类型,当我为它运行我创建的 JUnit 测试时会出现以下语法错误: java.lang.Error: Unresolved compilation problems: Synt
我正在尝试创建一个程序,它将单词列表作为输入,并将它们排序为二叉树,以便能够找到它们,例如像字典。这是我到目前为止所做的,但是 newEl -> el = input; 出现段错误,我知道这是因为它试
你好 我有编译这个问题 \begin{equation} J = \sum_{j=1}^{C} \end{equation} 我不断收到错误 missing $ inserted 这很奇怪,因
我需要使用 LINQ to SQL 将记录插入到没有主键的表中。 table 设计得很差;我无法控制表结构。该表由几个 varchar 字段、一个文本字段和一个时间戳组成。它用作其他实体的审计跟踪。
我正在尝试使用 itextsharp 创建 Pdf。我添加了一张包含两列的表格,其中一列包含文本和其他图像。我想要恒定的图像大小 如果另一个单元格中的文本增加并且其他单元格中的图像大小不同,我的图像会
我想把 calory 作为 fruits 的第一个值,我做不到,有人能帮忙吗? $sql = 'INSERT INTO fruits VALUES('', ?, ?, ?)'
我有一个包含季度观察结果的 data.frame。我现在想插入每月值(首选三次,线性很好)。中间目标应该是使用 DATE 创建一个 data.frame作为所有每月观察的索引和缺失值。 谷歌搜索表明我
我想知道是否有办法在值列表中使用“插入”。我正在尝试这样做: insert into tblMyTable (Col1, Col2, Col3) values('value1', value
我想让人们能够在他们的网站中插入单个 Javascript 行,这实际上允许我插入包含我网站内容的固定大小的 IFRAME。它实际上是一个小部件,允许他们搜索我的网站或接收其他信息。这可能吗? 最佳答
我有一个包含时间的表,列名为 time,数据类型为 Date。 在 asp.net 中,我想要一个查询插入日期,另一个查询则在 2 个日期之间进行选择。 我已经尝试过这个: string data =
这是我的代码: create or replace trigger th after insert on stock for each row declare sqty number;
这是一个带有具体示例的通用问题。 我有一个包含三个字段(流派 ID (PK IDENTITY)、流派和子流派)的表。该表对(流派,子流派)组合具有唯一约束。 我想知道如何修改存储过程以在表中不存在时插
因此,我正在遍历二叉树,节点包含字符串,以及读取文件时该字符串是否出现多次。我只查找读取文件时出现次数最多的前 10 个单词,因此本质上我只是比较 int 值。 我的问题是我正在尝试找出一种有效的方法
我有一张机票和行李 map , 每张门票必须是唯一的,并且必须与 map 上的位置相对应 是否可以仅更改行李(m_bagage->秒)而不更改 key ? std::unordered_map m_c
我正在使用 jdbc 驱动程序做一个示例项目。我的问题是,如果我在 2 文本字段中输入空值。 null 不应该加载到数据库中吗?有没有办法避免在数据库中插入空字段?任何帮助将不胜感激。 //Execu
我想知道 SSIS 中是否有特定的插入或更新选项。 如果我想让程序检查它是更新还是插入,我是否必须做一些编码?或者是否可以启用一个选项,以便它会自行检查 PK 是否存在,然后更新,否则插入? 亲切的问
我是一名优秀的程序员,十分优秀!