我在这个错误上停留的时间最长了,它变得非常烦人。我已经检查了无数次我的代码,就像我说的,我很恼火为什么会出现这个SQLAlchemy错误。
我在做什么:我试图通过使用用户输入,将数据以日期时间的格式发送到数据库,即"MM/DD/YYYY"。当实现时,代码似乎可以正常工作,直到我要求将日期"保存"到数据库。
class Task(db.Model):
__tablename__ = "tasks"
task_id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
due_date = db.Column(db.Date, nullable=False)
priority = db.Column(db.Integer, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
posted_date = db.Column(db.Date, default=datetime.datetime.utcnow())
status = db.Column(db.Integer)
def __init__(self, name, due_date, priority, status, user_id, posted_date):
self.name = name
self.due_date= due_date
self.priority= priority
self.status= status
self.posted_date = posted_date
self.user_id = user_id
def __repr__(self):
return '<name[0]>'.format(self.name)
上面的脚本是任务的模型
from views import db
from config import DATABASE_PATH
import sqlite3
from datetime import datetime
with sqlite3.connect(DATABASE_PATH) as connection:
c = connection.cursor()
c.execute("""ALTER TABLE tasks RENAME TO old_tasks""")
db.create_all()
c.execute("""SELECT name, due_date, priority,
status FROM old_tasks ORDER BY task_id ASC""")
data = [(row[0], row[1], row[2], row[3],
datetime.now(), 1) for row in c.fetchall()]
c.executemany("""INSERT INTO tasks (name, due_date, priority, status,
posted_date, user_id) VALUES (?, ?, ?, ?, ?, ?)""", data)
c.execute("DROP TABLE old_tasks")
上面的脚本删除了我现有的数据库,并用上面的凭据重写它。
@app.route('/add/', methods=['GET', 'POST'])
@login_required
def new_task():
form = AddTaskForm(request.form)
if request.method == 'POST':
if form.validate_on_submit():
new_task = Task(
form.name.data,
form.due_date.data,
form.priority.data,
datetime.datetime.utcnow(),
'1',
session['user_id']
)
db.session.add(new_task)
db.session.commit()
flash('New entry was successfully posted. Thanks!')
return redirect(url_for('tasks'))
else:
flash("Please put all credentials Necessary")
return redirect(url_for('tasks'))
return render_template('tasks.html', form=form)
上面的脚本来自我的views.py脚本,它是用所需凭据保存任务的算法。
我收到的烦人的错误恰好是这样的:
sqlalchemy.exc.StatementError:(内置.TypeError(SQLite日期类型只接受Python日期对象作为输入。[SQL:'插入任务(名称、日期、优先级、用户id、发布日期、状态(值(?,?,?,?('][参数:[{'状态':datetime.datetime(2016,7,1,5、24、48、23300(,"优先级":"6","posted_date":1,"due_date":datetime.date(2017,5,17(,'name':'lol','user_id':'1'}]]
我知道有一些问题得到了回答,但这个问题比后者要具体得多。如果你能帮忙,请回复!谢谢
看起来您正在从表单传递user_id
作为Task
构造函数中的posted_date
从您的视图创建新任务
new_task = Task(
form.name.data,
form.due_date.data,
form.priority.data,
datetime.datetime.utcnow(), #this should probably be at the end
'1',
session['user_id'] #check this here
)
任务构造函数
def __init__(self, name, due_date, priority, status, user_id, posted_date): #posted date is the last param
self.name = name
self.due_date= due_date
self.priority= priority
self.status= status
self.posted_date = posted_date
self.user_id = user_id