+1 Daumen
855 Aufrufe

Mit diesem Chatbot möchte ich irgendwann in der Konversation eine SQL-Abfrage durchführen, um eine Tabelle in einer MySQL-Datenbank zu popularisieren, aber sie gibt im Terminal zurück, dass ich einen Fehler in meiner SQL-Syntax habe, und zwar bei der Ausführung von cursor.execute bei meiner SQL-Abfrage:

print("before execute")
cursor = cnx.cursor()

add new booking
add_booking = ("INSERT INTO reservations "
              "(name_room, hour_start, hour_end) "
          "VALUES (%s, %s, %s)")
cursor.execute(add_booking)
print("after execute")

Ich verwende die Werte blue 5-1-2019 2pm 30 minutes und verstehe nicht, warum ich einene Namen (blue), ein Eintrittsdatum und ein Beendigungsdatum in eine Datenbank mit der folgenden Struktur einzugeben.

    mysql> DESCRIBE reservations;
    +------------+--------------+------+-----+---------+-------+
    | Field      | Type        | Null | Key | Default | Extra |
    +------------+--------------+------+-----+---------+-------+
    | name_room  | varchar(100) | NO  |    | NULL    |      |
    | hour_start | varchar(100) | NO  |    | NULL    |      |
    | hour_end  | varchar(100) | NO  |    | NULL    |      |
    +------------+--------------+------+-----+---------+-------+
    3 rows in set (0.06 sec)

Es hat immer funktioniert, wie Sie es aus alten Daten hier sehene können:

    mysql> SELECT * FROM reservations;
    +-----------+---------------------------+---------------------------+
    | name_room | hour_start                | hour_end                  |
    +-----------+---------------------------+---------------------------+
    | blue      | 2019-04-18T14:00:00+00:00 | 2019-04-18T14:30:00+00:00 |
    | blue      | 2019-04-20T09:00:00+00:00 | 2019-04-20T09:30:00+00:00 |
    | blue      | 2019-04-30T13:00:00+00:00 | 2019-04-30T13:30:00+00:00 |
    | blue      | 2019-05-01T14:00:00+00:00 | 2019-05-01T14:30:00+00:00 |
    +-----------+---------------------------+---------------------------+
    4 rows in set (0.00 sec)

Hier ist, was das Terminal zurückgibt:

    (staenv) C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack>python -m rasa_core_sdk.endpoint --actions actions
    2019-05-01 17:46:10 INFO    __main__  - Starting action endpoint server...
    2019-05-01 17:46:20 INFO    rasa_core_sdk.executor  - Registered function for 'action_joke'.
    2019-05-01 17:46:20 INFO    rasa_core_sdk.executor  - Registered function for 'action_room'.
    2019-05-01 17:46:20 INFO    __main__  - Action endpoint is up and running. on ('0.0.0.0', 5055)
    inside run
    before booking_answer
    blue 5-1-2019 2pm 30 minutes
    query_select_all:
    SELECT * FROM reservations
    date: 2019-05-01T14:00:00+00:00
    date: 2019-05-01T14:30:00+00:00
    cur_select_all:
    CMySQLCursorBuffered: SELECT * FROM reservations
    start_time:  2019-04-18T14:00:00+00:00
    end_time:  2019-04-18T14:30:00+00:00
    date: 2019-04-18T14:00:00+00:00
    date: 2019-04-18T14:30:00+00:00
    start_time:  2019-04-20T09:00:00+00:00
    end_time:  2019-04-20T09:30:00+00:00
    date: 2019-04-20T09:00:00+00:00
    date: 2019-04-20T09:30:00+00:00
    start_time:  2019-04-30T13:00:00+00:00
    end_time:  2019-04-30T13:30:00+00:00
    date: 2019-04-30T13:00:00+00:00
    date: 2019-04-30T13:30:00+00:00
    Hey, I just checked and the room is available :-)
    booking_answer : True
    before connexion
    before execute
    before execute
    [2019-05-01 18:10:07,717] ERROR in app: Exception on /webhook [POST]
    Traceback (most recent call last):
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\mysql\connector\connection_cext.py", line 395, in cmd_query
        raw_as_string=raw_as_string)
    _mysql_connector.MySQLInterfaceError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s, %s, %s)' at line 1
   
    During handling of the above exception, another exception occurred:
   
    Traceback (most recent call last):
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\actions.py", line 72, in run
        cursor.execute(add_booking)
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\mysql\connector\cursor_cext.py", line 266, in execute
        raw_as_string=self._raw_as_string)
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\mysql\connector\connection_cext.py", line 398, in cmd_query
        sqlstate=exc.sqlstate)
    mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s, %s, %s)' at line 1
   
    During handling of the above exception, another exception occurred:
   
    Traceback (most recent call last):
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\flask\app.py", line 2292, in wsgi_app
        response = self.full_dispatch_request()
...     
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\actions.py", line 75, in run
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    NameError: name 'errorcode' is not defined
    2019-05-01 18:10:07 ERROR    flask.app  - Exception on /webhook [POST]
    Traceback (most recent call last):
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\mysql\connector\connection_cext.py", line 395, in cmd_query
        raw_as_string=raw_as_string)
    _mysql_connector.MySQLInterfaceError: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s, %s, %s)' at line 1
   
    During handling of the above exception, another exception occurred:
   
    Traceback (most recent call last):
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\actions.py", line 72, in run
        cursor.execute(add_booking)
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\mysql\connector\cursor_cext.py", line 266, in execute
        raw_as_string=self._raw_as_string)
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\mysql\connector\connection_cext.py", line 398, in cmd_query
        sqlstate=exc.sqlstate)
    mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%s, %s, %s)' at line 1
   
    During handling of the above exception, another exception occurred:
   
    Traceback (most recent call last):
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\staenv\lib\site-packages\flask\app.py", line 2292, in wsgi_app
        response = self.full_dispatch_request()
...
      File "C:\Users\antoi\Documents\Programming\Nathalie\18_2_2019\starter-pack-rasa-stack\actions.py", line 75, in run
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    NameError: name 'errorcode' is not defined


Avatar von

Könntest du einmal die Query bei:

add_booking = ("INSERT INTO reservations "
                          "(name_room, hour_start, hour_end) "
                          "VALUES (%s, %s, %s)")
            cursor.execute(add_booking)
erzeugen mittels:

print cursor._last_executed

Dann wird die exakte MySQL-Query angezeigt und das Problem sollte erkennbar sein.

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Fehleranalyse und Behebung: SQL-Syntax und Programmierpraxis

Das aufgeführte Problem liegt in der Nutzung der cursor.execute Methode ohne die Übergabe der notwendigen Parameter für die Platzhalter %s in Ihrer SQL-Anweisung. Beim Versuch, die SQL-Anweisung auszuführen, scheitert es, da die Werte zum Ersetzen der Platzhalter %s im Befehl add_booking fehlen.

In der fehlerhaften Zeile:

python
cursor.execute(add_booking)

sollten Sie die Werte als zweites Argument in Form eines Tupels oder einer Liste übergeben, die den Platzhaltern %s in Ihrer SQL-Anweisung entsprechen.

Angesichts der Datenbankstruktur und Ihrer Absicht, "blue", "5-1-2019 2pm" als Startzeit und "30 minutes" später als Endzeit hinzu (was zuerst zu einem ordnungsgemäßen Datums-/Zeitformat konvertiert werden muss) zu fügen, sollte Ihr Code in etwa so aussehen:

python
# Beispielwerte
room_name = "blue"
start_time = "2019-05-01 14:00:00" # Angenommen, dies entspricht "5-1-2019 2pm" nach der Konvertierung in ein kompatibles Format
duration = 30 # 30 Minuten
end_time = "2019-05-01 14:30:00" # Hier müssten Sie die Startzeit um die Dauer erhöhen, um die Endzeit zu berechnen

add_booking = ("INSERT INTO reservations "
               "(name_room, hour_start, hour_end) "
               "VALUES (%s, %s, %s)")

# Ausführen der Anfrage mit Parametern
cursor.execute(add_booking, (room_name, start_time, end_time))


Für die Konvertierung der eingegebenen Startzeit und die Berechnung der Endzeit basierend auf der Dauer können Sie Python's datetime Bibliothek wie folgt verwenden:

python
from datetime import datetime, timedelta

# Konvertierung von "5-1-2019 2pm" in ein datetime-Objekt (Beispiel)
start_time_str = "5-1-2019 2pm"
start_time = datetime.strptime(start_time_str, '%m-%d-%Y %I%p')

# Hinzufügen der Dauer zur Startzeit, um die Endzeit zu berechnen
end_time = start_time + timedelta(minutes=duration)

# Konvertieren der datetime-Objekte zurück in Strings im Format, das Ihre Datenbank erwartet
start_time_formatiert = start_time.strftime('%Y-%m-%d %H:%M:%S')
end_time_formatiert = end_time.strftime('%Y-%m-%d %H:%M:%S')


Vergessen Sie nicht, die Transaktion mit cnx.commit() abzuschließen, wenn Sie Änderungen an der Datenbank vornehmen, und behandeln Sie mögliche Ausnahmen, um Fehler ordnungsgemäß zu steuern.
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community