Возникли проблемы с автоинкрементом в API - PullRequest
0 голосов
/ 06 февраля 2020

Я создал API списка дел с Flask и SQlite, и теперь я пытаюсь использовать AUTOINCREMENT для увеличения идентификаторов для задач. Тем не менее я получаю сообщение об ошибке («Ошибка: ограничение NOT NULL не удалось: incomplete.id») при попытке добавить что-то в список. Я не уверен, почему, я посмотрел документацию sqlite, и я, кажется, следую. Я даже попытался переформатировать операторы создания таблицы. Я не уверен, что еще делать, я был бы очень признателен за некоторые рекомендации / советы / помощь. Спасибо!

Вот мой помощник.py

import helper
from flask import Flask, request, jsonify, Response

import json

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/tasks/new', methods=['PUT'])
def add_task():
    # global idCount
    # idCount = idCount + 1 
    # get item from the POST body, request module used to parse request and get HTTP body data. response is used to return response to the client, of type JSON
    req_data = request.get_json()
    task = req_data['task']
    # add task to the list
    res_data = helper.add_to_incomplete(task)

    # return error if task cant be added
    if res_data is None:
        response = Response("{'error': 'Task not added - " + task + "'}", mimetype='application/json')
        return response;
    response = Response(json.dumps(res_data), mimetype='application/json')
    return response 

@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)
    # find matching task to input id
    return "un-completed 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 

@app.route('/tasks/empty', methods = ["EMPTY"])
def delete_all():
    helper.empty()
    return "you deleted everything"


Вот мой помощник.py:

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 INTEGER PRIMARY KEY, task TEXT NOT NULL);")
# save the change
c.execute("CREATE TABLE IF NOT EXISTS incomplete (id INTEGER PRIMARY KEY, task TEXT NOT NULL);")
conn.commit()


def add_to_incomplete(task): 
    try:
        # id = str(random.randrange(100,999))
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('insert into incomplete(task) values(?)', (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()[0]
        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 task from complete where id=?', (inputId,))
        tasks = c.fetchone()[0]
        c.execute('insert into incomplete values(?,?)', (inputId,tasks))
        delete_task(inputId)
        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

def empty():
    try:
        conn = sqlite3.connect(DB_PATH)
        c = conn.cursor()
        c.execute('delete from complete')
        c.execute('delete from incomplete')
        conn.commit()
        return "you deleted everything mwahaha"
    except Exception as e:
        print('Error: ', e)
        return None


1 Ответ

0 голосов
/ 06 февраля 2020

Я бы предложил изменить код создания таблицы sql на:

create table if not exists complete
(
    id int auto_increment,
    constraint complete_pk
        primary key (id)
);

Однако лучше использовать SQLAlchemy

...