Erreur communication Java Python

Marleyyyyy Messages postés 2 Date d'inscription lundi 15 avril 2024 Statut Membre Dernière intervention 28 juin 2024 - Modifié le 2 juil. 2024 à 16:16
mamiemando Messages postés 33284 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 septembre 2024 - 2 juil. 2024 à 16:32

Bonjour,

Je viens vers vous pour car j'ai une erreur que je n'arrive vraiment pas à résoudre.

Voici l'énoncé du projet :

Programmez maintenant une seconde table SQL virtuelle H2 weatherdatapython, qui lit toujours les données depuis weatherdata.csv, mais qui cette le fait via l'interop Python. Cette fois, le code de votre fonction doit abriter un environnement d'exécution Python tel que nous l'avions fait pendant le TP3.

Votre fonction Java définissant la fonction virtuelle doit exécuter une chaîne de caractères représentant du code Python. Ce code Python doit contenir une fonction prochainerangee(i) (sans accents) permettant de lire la prochaine rangée de cette table côté Python, et de la renvoyer à Java.

Attention, vous ne devez pas renvoyer les données n'importe comment: vous devez renvoyer les données Python déjà correctement typées en Python (entier, chaîne de caractères, date...), et dans un tableau Python.

Le code Java doit lire le tableau-résultat correspondant aux données de la rangée, et convertir les données de types Python vers des types SQL de manière appropriée. prochainerangee(i) renverra un tableau vide pour signifier à Java que le parcours est terminé.

Voici mon code java : 

public void createWeatherDataPythonTable(String pythonScript) throws SQLException {
        String connUrl = "jdbc:h2:./h2database";
        String username = "sa";
        String password = "";

        try (Connection conn = DriverManager.getConnection(connUrl, username, password)) {
            Statement stmt = conn.createStatement();

            // Drop existing weatherdatapython table if exists
            String dropTableSQL = "DROP TABLE IF EXISTS weatherdatapython";
            stmt.execute(dropTableSQL);

            // Create weatherdatapython virtual table using Python3 script
            String createTableSQL = "CREATE VIRTUAL TABLE weatherdatapython USING org.h2.api.Extension " + "AS SELECT * FROM SCRIPT('python3', ?)";

            try (PreparedStatement pstmt = conn.prepareStatement(createTableSQL)) {
                pstmt.setString(1, pythonScript);
                pstmt.executeUpdate();
            }
        }
    }

... et voici mon weatherdatapython.py :

import csv
import datetime

class WeatherDataPython:
    def __init__(self):
        self.csv_file = "weatherdata.csv"
        self.current_row = 0
        self.data = self.load_data()

    def load_data(self):
        with open(self.csv_file, 'r') as f:
            reader = csv.reader(f)
            next(reader)  # Skip header
            data = list(reader)
        return data

    def prochainerangee(self, i):
        if self.current_row < len(self.data):
            row = self.data[self.current_row]
            self.current_row += 1
            log_date = datetime.datetime.strptime(row[1], '%Y-%m-%d').date()
            time = datetime.datetime.strptime(row[2], '%H:%M:%S').time()
            station = int(row[3])
            temp = float(row[4])
            humidity = float(row[5])
            airpressure = float(row[6])
            wind = float(row[7])
            weather = row[8]
            winddirection = int(row[9])
            return [
                log_date, time, station, temp,
                humidity, airpressure, wind, weather, winddirection
            ]
        else:
            return []

... et tout cela me retourne une erreur comme ceci : 

org.h2.jdbc.JdbcSQLSyntaxErrorException: Erreur de syntaxe dans l'instruction SQL
"CREATE VIRTUAL[*] TABLE WEATHERDATAPYTHON USING ORG.H2.API.EXTENSION AS SELECT * FROM SCRIPT('python3', ?) "; attendu "OR, FORCE, VIEW, ALIAS, SEQUENCE, USER, TRIGGER, ROLE, SCHEMA, CONSTANT, DOMAIN, TYPE, DATATYPE, AGGREGATE, LINKED, MEMORY, CACHED, LOCAL, GLOBAL, TEMP, TEMPORARY, TABLE, SYNONYM, PRIMARY, UNIQUE, HASH, SPATIAL, INDEX"

Syntax error in SQL statement "CREATE VIRTUAL[*] TABLE WEATHERDATAPYTHON USING ORG.H2.API.EXTENSION AS SELECT * FROM SCRIPT('python3', ?) "; expected "OR, FORCE, VIEW, ALIAS, SEQUENCE, USER, TRIGGER, ROLE, SCHEMA, CONSTANT, DOMAIN, 
TYPE, DATATYPE, AGGREGATE, LINKED, MEMORY, CACHED, LOCAL, GLOBAL, TEMP, TEMPORARY, TABLE, SYNONYM, PRIMARY, UNIQUE, HASH, SPATIAL, INDEX";

SQL statement:
CREATE VIRTUAL TABLE weatherdatapython USING org.h2.api.Extension AS SELECT * FROM SCRIPT('python3', ?) [42001-199] 

Désolé pour le message un peu long, merci d'avance pour votre réponse.

Modération : merci de mettre en forme le message comme expliqué ici.

A voir également:

2 réponses

Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
28 juin 2024 à 17:56

Bonjour 

tout d'abord pour tes prochains posts, il faut faire comme décrit ici pour poster un code.

Je ne connais pas l'api interop pyhon en java, mais je doute fortement que directement dans une requête sql tu puisses utiliser une méthode qui s'appelle prochainerangee.

Si ça avait été nextrow, même si ça ne respecte ni les conventions de nommage Java, ni celles de Python, j'aurais hésité et n'aurais pas répondu.

Mais un méthode nommée en français, sans respect des conventions, il n'y a aucune chance que java sache s'en servir par magie.

A mon avis, tu dois faire en sorte d'appeller cette méthode pour extraire une ligne du fichier csv et la fournir en java à la requête sql.

Dans tous les cas, commence par vérifier que ton script pyhon fait ce qu'on lui demande en l'appelant en python et en printant les résultats 


0
mamiemando Messages postés 33284 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 25 septembre 2024 7 787
2 juil. 2024 à 16:32

Bonjour,

Si je m'en tiens au message d'erreur, le problème est dans la requête que tu passes à JDBC (le connecteur java pour interagir avec une base de données). Le message dit clairement qu'il y a une erreur de syntaxe.

Dans ton code java, cela correspond à la ligne :

 String createTableSQL = "CREATE VIRTUAL TABLE weatherdatapython USING org.h2.api.Extension " + "AS SELECT * FROM SCRIPT('python3', ?)";

Je pense aussi que tu ne nous dit pas tout, car je ne vois pas comment ton code Java peut deviner quelle classe / méthode Python utiliser.

Hormis l'intérêt pédagogique, j'ai un peu de mal à comprendre l'intérêt de passer par python sachant que H2 sait déjà lire un fichier csv (mais je suppose que le but est d'apprendre à utiliser des virtual tables ?).

Enfin, sur quelle référence t'es-tu basé pour rédiger le code que tu proposes ? Est-ce que ce que tu appelles virtual table n'est pas plutôt une view (en SQL, tu peux effectivement définir une table virtuelle à l'aide de CREATE VIEW et définie par une requête SELECT.)

Bonne chance

0