SQLITE - Сбой ограничения NOT NULL - перенос строки из одной таблицы в другую - PullRequest
0 голосов
/ 06 февраля 2020

Я создаю API списка дел с помощью sqlite и flask. У меня есть файл main.py, todo.db и helper.py.

У меня есть функция (это мой запрос POST). У меня есть две таблицы базы данных, которые называются неполными и полными. Моя функция должна «завершить» действие, удалив соответствующую задачу из незавершенной, скопировав ее и поместив в нее.

Я пробовал много разных вещей, постоянно получал разные ошибки, от «база данных заблокирована» до «Параметр привязки ошибок 1», и теперь это:

Error: NOT NULL constraint failed: complete.task

Я получил функцию, по крайней мере, удалить соответствующую задачу из незавершенной и добавить что-то для завершения, но она добавляет ее неправильно. Вместо чего-то вроде этого вывода, когда я использую запрос GET:

[{"complete": [["678", "do dishes" ]]}, {"incomplete": [["756", "Setting up API"]]}]

я получаю что-то вроде этого

[{"complete": [["678", "[]"]}, {"incomplete": [["756", "Setting up API"]]}]

I ' Я не уверен, что я делаю неправильно. Я также получаю сообщение об ошибке, когда я не завершаю элементы (я получаю «Внутренняя ошибка сервера») :(

Вот вспомогательный файл с пропущенными частями. Этот фрагмент включает в себя соответствующие части и часть, на которой я концентрируюсь, это add_to_completes ().

import sqlite3
import random 

#for id's because users dont set them

DB_PATH = './todo.db'

# connect to database
conn = sqlite3.connect(DB_PATH)
c = conn.cursor()

c.execute("""CREATE TABLE IF NOT EXISTS "complete" ("id" TEXT NOT NULL, "task" TEXT NOT NULL, PRIMARY KEY("id"));""")
# save the change
c.execute("""CREATE TABLE IF NOT EXISTS "incomplete" ("id" TEXT NOT NULL, "task" TEXT NOT NULL, PRIMARY KEY("id"));""")
conn.commit()
def add_to_incomplete(task): 
    id = random.randint(100, 999)
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('insert into incomplete(id, task) values(?,?)', (id, task))
        conn.commit()
        return {"id": id}

    except Exception as e:
        print('Error: ', e)
        return None

def add_to_complete(inputId):
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('select task from incomplete where id=?', (inputId,))
        tasks = c.fetchone()
        c.execute('insert into complete values(?,?)', (inputId,tasks))
        delete_task(inputId)
        conn.commit()
        return {"id": id}

    except Exception as e:
        print('Error: ', e)
        return None

def get_all_completes():
    try: 
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('select * from complete')
        rows = c.fetchall()
        conn.commit()
        return { "complete": rows }
    except Exception as e:
        print('Error: ', e)
        return None

def get_all_incompletes():
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('select * from incomplete')
        rows = c.fetchall()
        conn.commit()
        return { "incomplete": rows } 
    except Exception as e:
        print('Error: ', e)
        return None 
def uncomplete(inputId):
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('select from complete where id=?', (inputId,))
        row = c.fetchall()
        c.execute('delete from complete where id=?', (inputId,))
        #you have that format (item,) because we need to pass execute() a tuple even if theres only one thing in the tuple
        add_to_incomplete(row)
        conn.commit()
        return {"id":id}
    except Exception as e:
        print('Error: ', e)
        return None
def delete_task(inputId):
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('delete from complete where id=?', (inputId,))
        c.execute('delete from incomplete where id=?', (inputId,))
        conn.commit()
        return {"id":id}
    except Exception as e:
        print('Error: ', e)
        return None

Вот соответствующие части моего файла main.py:

import helper
from flask import Flask, request, Response

import json

app = Flask(__name__)

...

@app.route('/tasks/all', methods = ["GET"])
def get_all_items():
    res_data = helper.get_all_completes(), helper.get_all_incompletes()
    response = Response(json.dumps(res_data), mimetype='application/json')
    return response

@app.route('/tasks/complete', methods = ["POST"])
def complete_task():
    req_data = request.get_json()
    inputId = req_data['id']
    res_data = helper.add_to_complete(inputId)
    # find matching task to input id
    return "completed task" + inputId

@app.route('/tasks/incomplete', methods = ["PATCH"])
def uncomplete_task():
    req_data = request.get_json()
    inputId = req_data['id']
    res_data = helper.uncomplete(inputId)
    if res_Data is None:
        response =  Response("{'error': 'Error uncompleting task - '" + task + ", " + status   +  "}", status=400 , mimetype='application/json')
    response = Response(json.dumps(res_data), mimetype='application/json')
    return "uncompleted task" + " " + inputId 

...
@app.route('/tasks/remove', methods = ["DELETE"])
def delete():
    req_data = request.get_json()
    inputId = req_data['id']
    res_data = helper.delete_task(inputId)
    if res_data is None:
        response = Response("{'error': 'Error deleting task - '" + task +  "}", status=400 , mimetype='application/json')
    return "deleted task id" + " " + inputId 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...