由于Query-invoked autoflush导致的SQLAlchemy OperationalError

Pav*_*dhu 7 python mysql sql sqlalchemy flask-sqlalchemy

我在数据库中有一个表,它通过SQLAlchemy创建和访问:

我使用Flask-SQLAlchemy添加一条记录,如下所示:

...
content = request.form['content']
date = datetime.today()
post = Post(date, content)
db.session.add(post)
db.session.commit()
...
Run Code Online (Sandbox Code Playgroud)

此记录被添加到表中.在执行该代码之后,我查询另一个表:

userID = session['userID']
posts = db.session.query(Post).filter_by(userID=userID).count()
Run Code Online (Sandbox Code Playgroud)

但是我在查询期间收到错误:

OperationalError :(由于Query-invoked autoflush引发;考虑使用session.no_autoflush块,如果此刷新过早发生)(_mysql_exceptions.OperationalError)(1292,"不正确的日期值:'11/20'列'日期'在第1行")[SQL:u'UPDATE发布SET日期=%s WHERE posts.id =%s'] [参数:(('11/20',1L))]

为什么在将记录添加到表时已经指定了帖子的日期?这个错误的原因是什么呢?谢谢.

编辑:

这就是表模型的样子:

class Post(db.Model):

  __tablename__ = 'posts'

  id = db.Column(db.Integer, primary_key=True)
  content = db.Column(db.String(500))
  date = db.Column(db.Date, nullable=False)

  def __init__(self, id, content, date):
      self.id = id
      self.content = content
      self.date = date
Run Code Online (Sandbox Code Playgroud)

She*_*xed 5

Stephane是对的,您将错误的类型传递给模型,要么传递 datetime.date 对象,要么更改模型的定义。至于问题的第一部分,我建议阅读有关session 和 flushing 的内容。这个很重要:

Session 维护的对象的所有更改都会被跟踪 - 在再次查询数据库或提交当前事务之前,它将所有挂起的更改刷新到数据库。

因此,通过创建 post 对象并将其添加到会话中,您只是进行了一个待处理的更改,但此时还没有与数据库进行通信。这发生在flush() 中,您可以手动或自动调用它,例如,通过调用commit()。

(顺便说一句。您不需要为模型创建自己的 init 方法,请参阅http://docs.sqlalchemy.org/en/latest/orm/tutorial.html#adding-and-updating-objects


Ste*_*tin 1

date = datetime.today()返回日期时间对象(日期和时间)

但模型的日期属性Post是 db.Date (没有时间的日期)

尝试以下任一方法:

  from datetime import date

  ...

  content = request.form['content']

  date = date.today()    #inject a Date object rather than a Datetime
Run Code Online (Sandbox Code Playgroud)

或者:

  class Post(db.Model):     #modify Post schema

  ...

     date = db.Column(db.TIMESTAMP, nullable=False)
Run Code Online (Sandbox Code Playgroud)