flask-sqlalchemy(1)

记录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查询返回的格式问题,虽然普通表和创建的模型处理不同,但是返回的格式是一样的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值