SQLite日期类型查询网站的数据库时出错

时间:2016-07-01 05:39:00

标签: python sqlite date datetime

我一直坚持这个错误的时间最长,而且非常烦人。我已经无数次检查了我的代码,就像我说我为什么会出现这个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)

上面的脚本是Task的模型

    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:(builtins.TypeError)SQLite日期类型   只接受Python日期对象作为输入。 [SQL:'插入INTO任务   (name,due_date,priority,user_id,posted_date,status)VALUES(?,?,   ?,?,?,?)'] [参数:[{'status':datetime.datetime(2016,7,1,   5,24,48,23300),'priority':'6','posted_date':1,'due_date':   datetime.date(2017,5,17),'name':'lol','user_id':'1'}]]

我知道有关于此问题的答案,但这个问题比后者更具体。如果您能提供帮助请回复! 谢谢!

1 个答案:

答案 0 :(得分:1)

您似乎正在将user_id作为posted_date构建函数中的Task传递给表单

从您的视图中创建新任务

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