Première question. J'écris une application Python pour un usage personnel, qui lit les métadonnées des fichiers MP3 que j'ai collectés sur CD-ROM et les insère dans une base de données MySQL. Au moins, cela devrait - mais en ce qui concerne l'instruction INSERT réelle, le programme lance une erreur ProgrammingError: "1064: vous avez une erreur dans votre syntaxe SQL", etc.

En essayant d'écrire ce programme, j'ai appris à créer des requêtes paramétrées, à instancier l'objet curseur avec cursor_class = MySQLCursorPrepared et à instancier la connexion à la base de données avec use_pure = True . J'ai cherché sur le Web des problèmes similaires, mais je me suis asséché.

Voici le code incriminé (c'est la ligne cursor.execute spécifiquement qui lève l'exception; à des fins de débogage, j'ai temporairement supprimé les blocs try / except):

table = "mp3_t"
# Parameterized query for SQL INSERT statement
query = '''
INSERT INTO %s
(track_num, title, artist, album, album_year, genre, discname)
VALUES
(%s, '%s', '%s', '%s', %s, '%s', '%s')
'''

conn = self.opendb(self.config)
cursor = conn.cursor(cursor_class = MySQLCursorPrepared)
for track in tracklist:
    print("Counter: {}".format(counter))
    # Tuple for parameterized query
    input = (table, track['track_num'], track['title'],
             track['artist'], track['album'], track['album_year'],
             track['genre'], track['discname'])
    print(query % input) # What is the actual query?
    cursor.execute(query, input)

La table de base de données est définie avec le SQL suivant:

CREATE TABLE mp3_t (
    id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
    track_num int NOT NULL,
    title VARCHAR(255) NOT NULL,
    artist VARCHAR(255) NOT NULL,
    album VARCHAR(255) NOT NULL,
    album_year int NOT NULL,
    genre VARCHAR(255) NOT NULL,
    discname VARCHAR(255) NOT NULL);

Pour le débogage, j'ai une instruction d'impression qui génère la requête envoyée à MySQL (le message d'erreur est particulièrement inutile pour essayer d'identifier la cause du problème), par exemple:

INSERT INTO mp3_t
    (track_num, title, artist, album, album_year, genre, discname)
    VALUES
    (1, 'Moribund the Burgermeister', 'Peter Gabriel', 'I', 1977, 'Rock', 'Rock 19')

Je ne vois aucune erreur visuellement, et si je colle directement dans la CLI MySQL et ajoute le point-virgule requis, il insère une ligne dans la table comme prévu.

Je suis complètement bloqué sur le problème.

Si c'est une aide, j'utilise Python 3.6.7 et MariaDB 10.1.37 avec Connector / Python 8.0.15, sur Ubuntu 18.04 64 bits.

0
RansomOttawa 15 mars 2019 à 09:44

2 réponses

Meilleure réponse

Le nom de la table ne doit pas être remplacé par %s. Je pense que votre message d'erreur devrait:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near "mp3_t"

Il suffit donc d'utiliser le nom de la table dans votre modèle de requête.

INSERT INTO mp3_t
(track_num, title, artist, album, album_year, genre, discname)
VALUES
(%s, %s, %s, %s, %s, %s, %s)

Si vous voulez savoir que la requête sera exécutée, vous devez utiliser ces codes:

conn = connect()
cur = conn.cursor()
print(query % cur._get_db().literal(params))
0
Yang HG 15 mars 2019 à 07:14

N'utilisez pas% s pour le nom de la table. Utilisez directement le nom de la table.

0
User111213 15 mars 2019 à 06:57