Я написал приложение Flask, которое может обращаться к базе данных mysql, работающей в Dockerfile, со следующей схемой:
CREATE TABLE tasksdb (
id INTEGER AUTO_INCREMENT PRIMARY KEY,
task VARCHAR(20),
is_completed BOOLEAN,
notify VARCHAR(100)
);
Мне нужно вернуть идентификатор задачи, которая была создана в последний раз. Таким образом, я хотел бы получить идентификатор из базы данных. Я пробовал несколько вариантов, но ни один из них не работал:
cursor.execute('SELECT id FROM tasksdb WHERE task="%s"', [task])
print(cursor.fetchall())
Вывод: ()
cursor.execute("SELECT COUNT(*) FROM tasksdb")
Вывод: ((1,),)
, ((2,),)
et c каждый раз запустить команду.
Тем не менее, я запутался, поскольку база данных показывает это при запуске следующего в оболочке Docker bash:
SELECT * from tasksdb;
Empty set (0.00 sec)
Тем не менее, я пытаюсь получить 1,2 et c из вывода, чтобы моя функция могла вернуть это:
Проблема в том, что string_id=str(cursor.fetchall())
приводит к выводу ()
. Таким образом, я понятия не имею, как получить доступ к средней части.
res = int(''.join(map(str, cursor.fetchall())))
ведет к ValueError: invalid literal for int() with base 10: ''
res=cursor.fetchall()[0]
ведет к: IndexError: tuple index out of range
Не могли бы вы помочь мне, как я мог получить идентификатор?
Кроме того, мне интересно, почему идентификатор всегда начинается снова с 1 при перезапуске приложения flask и запуске теста, но не при перезапуске контейнера mysql. Я ожидаю, что контейнер и база данных будут создавать задачи с новым идентификатором даже после перезапуска.
Вот мой полный код:
from flask import Flask, request, Response
import json
import MySQLdb
import json
app = Flask(__name__)
cursor = None
def get_db_connection():
global cursor
if not cursor:
db = MySQLdb.connect("127.0.0.1", "root", "DockerPasswort!", "demo", port=3306)
cursor = db.cursor()
return cursor
# Create a new task
@app.route('/v1/tasks', methods=['POST'])
def post():
cursor = get_db_connection()
data = request.get_json()
if "title" not in data:
return bulkadd(data)
is_completed=False
if "is_completed" in data:
is_completed=data["is_completed"]
notify=""
if "notify" in data:
notify=data["notify"]
task = data["title"]
sql='INSERT INTO tasksdb (task, is_completed, notify) VALUES (%s, %s, %s)'
cursor.execute(sql, [task, is_completed, notify])
#Insert any of the attempts to obtain the id here and return it.
return "True"
Спасибо за вашу помощь!
------------------------------------- EDIT ---------- ------------- Я просто добавил задачу прямо в mysql и выполнил это:
SELECT * from tasksdb;
+----+---------------+--------------+-----------------------------+
| id | task | is_completed | notify |
+----+---------------+--------------+-----------------------------+
| 22 | My First Task | 0 | test@berkeley.edu |
+----+---------------+--------------+-----------------------------+
1 row in set
Тот факт, что id равен 22, убеждает меня в том, что ранее запросы были сохранены , Однако я не понимаю, почему возвращается только эта строка? Не следует ли сохранить все прежние запросы?