记录flask-sqlalchemy的坑。
1.测试是否成功创建多对多关系。
多对多关系三个关系表:
三个表:
由两个一对多关系,
SQLAlchemy 可以完成大部分两个一对多的查询操作。tagpostmap 表由SQLAlchemy自动处理,不是模型。
tagpostmap = db.Table(‘tagpostmap’,
db.Column(‘tag_id’, db.Integer, db.ForeignKey(‘tags.id’)),
db.Column(‘post_id’, db.Integer, db.ForeignKey(‘posts.id’))
)
class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
b_title = db.Column(db.Text)
body_html = db.Column(db.Text)
timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
tags = db.relationship('Tag',
secondary=tagpostmap,
backref=db.backref('posts', lazy='dynamic'),
lazy='dynamic')
class Tag(db.Model):
__tablename__ = 'tags'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
count = db.Column(db.Integer,default=0)
代码为添加标签到数据库中并把tags记录到post里,形成多对多关系。
for taglist in nametest.split(';') :
print taglist
if taglist :
tag = Tag.query.filter_by(name=taglist).first()
#tagname=taglist
if not tag :
tag = Tag(name=taglist,
count=1
)
else:
tag.count=tag.count+1
#db.session.add(tag)
db.session.add(tag)
post.tags.append(tag)#把标签加入文章里
db.session.add(post)
db.session.commit()
开始测试
创建文章,标签
>>> s = Post(body="#4",b_title="4",body_html="444")
>>> c = Tag(name="abcd",count=1)
>>> s.tags.append(c)
>>> db.session.add(s)
>>> c1 = Tag(name="defg",count=1)
>>>post.tags.all()
返回的一直显示这样:
[<app.models.Tag object at 0xb635878c>, <app.models.Tag object at 0xb627a48c>]
并没有显示正常的字符串数值。
通过在shell里新建一个测试数据对比发现这可能是一Model。
再加上属性name
>>> s.tags.all().name
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'list' object has no attribute 'name'
出错,提示list也就是列表没有这个name属性。也就是说它返回的是一个列表。查看最常使用的SQLAlchemy查询执行函数
all()以列表形式返回查询的所有结果
first() 返回查询的第一个结果,如果没有结果,则返回None
再测试:加上first()试试
>>> s.tags.first().name
u'abcd'
正确显示!
说明列表不可以,单个可以,再用for in 迭代:
>>> for u in s.tags.order_by(Tag.id).all().name :
... print u
...
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'list' object has no attribute 'name'
忘了属性问题,而且迭代用错了
继续:
>>> for u in s.tags.order_by(Tag.id).all() :
... print u.name
...
abcd
efgh
这样就对了!
总之就是flask-sqlalchemy查询返回的格式问题,虽然普通表和创建的模型处理不同,但是返回的格式是一样的