sqlalchemy.exc.OperationalError post.timestamp不存在


#1

数据模型:

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(60), unique=True)
    body = db.Column(db.Text)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow, index=True)
    edit_time = db.Column(db.DateTime, default=timestamp)
    author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    author = db.relationship('Author', back_populates='posts')
    category = db.relationship('Category', back_populates='posts')

视图函数:

@app.route('/new-post', methods=['POST', 'GET'])
@login_required
def new_post():
    form = PostForm()
    if form.validate_on_submit():
        new_post = Post(
            title=form.title.data,
            category=Category.query.get(form.category.data),
            body=form.body.data,
            author=current_user
        )
        db.session.add(new_post)
        db.session.commit()
        flash('文章发布成功!', 'success')
        return safe_redirect()
    return render_template('new_post.html', form=form)

错误信息:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: post.timestamp [SQL: 'INSERT INTO post (title, body, timestamp, edit_time, author_id, category_id) VALUES (?, ?, ?, post.timestamp, ?, ?)'] 

问题:

我在数据模型里 明明有 timestamp 这个字段,为什么还是要提示没有?

我使用 mariadb 数据库就完全没有问题!


#2

进入flask shell, 然后导入db对象,执行db.drop_all(),再执行db.create_all()试试


#3

要不直接进入数据库瞧瞧有没有这个字段?:smirk:


#4

有这个字段
而且无法执行 initdb
shell 里面 也报错
我用 mariaDB 就没有问题


#5

建议尽可能提供丰富的相关信息,比如:

无法执行 initdb

怎么无法执行?有报错信息吗?

shell 里面也报错

shell 指的是什么?报错信息是什么?


#6

我在 base.html 中引入了2个全局模板变量,一个 categories,(分类) 一个 posts(文章):

app.jinja_env.globals['categories'] = Category.query.order_by(Category.name).all()
app.jinja_env.globals['posts'] = Post.query.order_by(Post.timestamp.desc()).all()

在使用 initdb 命令之前, 这2个 数据模型 Category, Post 是不存在的!
而 initdb 需要 实例化 app , 所以会报错!
而且在数据库中, 就算添加了 Category 新内容,但是页面不会自动更新出来,需要重启服务器!


#7

注册模板上下文处理函数,而不是设置全局变量:

@app.context_processor
def insert_data():
    categories = Category.query.order_by(Category.name).all()
    posts = Post.query.order_by(Post.timestamp.desc()).all()
    return dict(categories=categories, posts=posts)

#8

太好了,终于搞定这个问题了!
还是我自己看书看的不仔细,这个问题搞混了!
非常感谢!