flask-sqlalchemy(1)

来源:互联网 发布:手机后花园软件 编辑:程序博客网 时间:2024/06/05 04:32

记录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().nameTraceback (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().nameu'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... abcdefgh

这样就对了!
总之就是flask-sqlalchemy查询返回的格式问题,虽然普通表和创建的模型处理不同,但是返回的格式是一样的

1 0
原创粉丝点击