IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

ajout d'un enregistrement d'une table d'un PI local vers une base extérieure en serveur mutualisé (OVH)


Sujet :

Réseau/Web Python

  1. #1
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut ajout d'un enregistrement d'une table d'un PI local vers une base extérieure en serveur mutualisé (OVH)
    Bonjour,

    J'ai sur un pi dans mon réseau local une table (T_Quotidien) à qui j'ajoute quotidiennement un enregistrement que je voudrais répercuter dans une base sur un serveur mutualisé OVH dont je sais que je n'ai pas accès de l'extérieur...
    Je désire que soit automatisé (à la fin de la mise à jour).
    J'ai imaginé ceci :

    1. Exporter par FTP sur le serveur distant un script SQL INSERT, direct en PYTHON ou alors en PHP
    2. L'exécuter à l'aide du cron qui semble accessible chez OVH

    ou :

    1. Exporter un .CVS
    2. Un script pour l'importer à l'aide du cron

    Dans tous les cas, ce serait chouette de trouver un moyen pour savoir si l'ajout a bien eu lieu et de retenter + tard si nécessaire

    Je n'ai jamais essayé le CRON d'OVH.

    Qu'en pensez-vous et pouvez-vous me donner une piste pour les scripts ?

    Un grand merci d'avance !

    Voici l'extrait du script qui ajoute l'enregistrement en local. mais s'il y a eu accident, il prévoit d'ajouter les enregistrements manquants. Vous savez que je suis un touche-à-tout et mon code est fort probablement perfectible. Il a la particularité de calculer les degrés-jours (équivalents), calculés à raison de 60 % de la température du jour même, de 30 % de la température du jour précédent et de 10 % de la température du jour qui précède encore. C'est le reflet théorique du déphasage thermique des bâtiments.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    # -*- coding: utf-8 -*-
    import mysql.connector
    from datetime import datetime, timedelta
     
    # script exécuté une fois par jour (à 00:07:30 ?)
    # version du 30/05/2022 (a)
     
    db = mysql.connector.connect(
      host="localhost",
      user="xxx",
      password="yyy",
      database="zzz"
    )
    cur = db.cursor()
     
    # -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-   -1-  
    # partie qui ne nous intéresse pas ici.
     
    #   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-   -2-
    # mise à jour de la table 't_quotidien' avec les valeurs quotidiennes de la table archive
     
    # 2-1 La dernière date de 't_quotidien'
    sql="SELECT Max(t_quotidien.q_date) AS X FROM t_quotidien;"
    cur.execute(sql)
    x = cur.fetchone()
    derDateQuot = x[0]
    print("derDateQuot =", end =" ")
    print (derDateQuot )
    derDateQuot+= timedelta(days=1) # on commence après la dernière date !
    # 2-2 la dernière 'date_jour' de 'archive'
    sql="SELECT Max(archive.date_jour) AS X FROM archive;"
    cur.execute(sql)
    x = cur.fetchone()
    derDateArch = x[0]
    # comme c'est théoriquement le jour en cours, on recule à la veille
    print("dernière date archive trouvée : ", end = ' ')
    print(derDateArch)
    derDateArch -= timedelta(days=1)
    print("on termine la veille : ", end = " ")
    print(derDateArch)
     
    # 2-3 Boucle entre derDateQuot et derDateArch, insertion des enregistrements
    delta=derDateArch-derDateQuot
    nbreJours=delta.days + 1
    print(nbreJours, end = ' ')
    print("jour(s) à calculer")
    for i in range(nbreJours):
        dateBoucle = derDateQuot+timedelta(days=i)
        print(dateBoucle, end = ' ')
     
        sql="SELECT Avg(archive.outTemp) AS MoyenneDeoutTemp, Max(archive.outTemp) AS MaxDeoutTemp1, Min(archive.outTemp) AS MinDeoutTemp, Avg(archive.outHumidity) AS MoyenneDeoutHumidity, Avg(archive.pressure) AS MoyenneDepressure, Sum(archive.rain) AS SommeDerain, Max(archive.rainRate) AS MaxDerainRate "
        sql += " FROM archive GROUP BY archive.date_jour "
        sql += "HAVING archive.date_jour='"
        sql += str(dateBoucle) + "';"
        cur.execute(sql)
        x = cur.fetchone()
        if (x is not None):
          if (len(x)==7):
            sql = "INSERT INTO t_quotidien VALUES("
            sql += "'" + str(dateBoucle) + "',"
            # température moyenne
            if (x[0] is not None):
              sql+= str(round(x[0],2))+", "
            else :
              sql+="Null, "
            # température max
            if (x[1] is not None):
              sql+= str(round(x[1],2))+", "
            else :
              sql+="Null, "
            # température min      
            if (x[2] is not None):
              sql+= str(round(x[2],2))+", "
            else :
              sql+="Null, "
            # Humidité moyenne
            if (x[3] is not None):
              sql+= str(round(x[3],1))+", "
            else :
              sql+="Null, "
            # bar
            if (x[4] is not None):
              sql+= str(round(x[4],2))+", "
            else :
              sql+="Null, "
            # rain
            if (x[5] is not None):
              sql+= str(round(x[5],4))+", "
            else :
              sql+="Null, "
            # rain rate
            if (x[6] is not None):
              sql+= str(round(x[6],4))
            else :
              sql+="Null"
            sql+=",Null,Null,Null);" # tpe, dj18, dj16
            #print(sql)
            try:
              # Executing the SQL command
              cur.execute(sql)
              # Commit your changes in the database
              db.commit()
            except:
              # Rolling back in case of error
              db.rollback()
    # 2.4 Calculs TPE, DJ18 et DJ16
    print("\nCalculs TPE & Cie\n")
    print("date \t\tTPE \tDJ16.5 \tDJ18")
    while True :
      # première date où tpe est null
      sql="SELECT Min(t_quotidien.q_date) AS MinDeq_date FROM t_quotidien GROUP BY t_quotidien.q_tpe HAVING t_quotidien.q_tpe Is Null;"
      cur.execute(sql)
      x = cur.fetchone()
      if (x is None):
        break # on sort de la boucle, tout est à jour
     
      derDateQuot=x[0]
      print(derDateQuot, end = '\t')
      TPE=0
      for i in range(3):
        DateQuot = derDateQuot- timedelta(days=2 - i)
        sql = "SELECT t_quotidien.q_temp FROM t_quotidien WHERE t_quotidien.q_date = '" + str(DateQuot) +"' ;"
        cur.execute(sql)
        x = cur.fetchone()
        if (x is not None):
          if (i==0):
            TPE = x[0]*0.1 # 2 jours avant = 10 %
          elif(i==1):
            TPE+=(x[0]*0.3) # 1 jour avant += 30 %
          else :
            TPE+=(x[0]*0.6) # le jour même += 60 %
     
      print(round(TPE,2),end='\t')
      if (16.5-TPE >= 0):
        DJ16= round(16.5-TPE,2)
      else :
        DJ16 = 0
      if (18-TPE >= 0):
        DJ18= round(18-TPE,2)
      else :
        DJ18 = 0
     
      print(round(DJ16,2), end='\t')
      print(round(DJ18,2), end='\n')
      sql="UPDATE t_quotidien SET t_quotidien.q_tpe = "+ str(TPE) 
      sql += ", t_quotidien.q_dj_18 = " +str(DJ18)
      sql += ", t_quotidien.q_dj_16 = " + str(DJ16)
      sql += " WHERE t_quotidien.q_date='" + str(DateQuot) +"';"
      try:
        # Executing the SQL command
        cur.execute(sql)
        # Commit your changes in the database
        db.commit()
      except:
        # Rolling back in case of error
        db.rollback()
     
     
    db.close

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    Hello,
    la base de données est de quel type ? mariadb ? postgresql ? mysql ? autre ?
    pas moyen de communiquer avec par du code (php ou autre) dans un serveur web ?
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    bonjour
    Citation Envoyé par Blaise Voir le message
    Dans tous les cas, ce serait chouette de trouver un moyen pour savoir si l'ajout a bien eu lieu et de retenter + tard si nécessaire
    Je ne vois pas de difficulté à ce que tu proposes :
    local : script envoi par ftp un fichier (date-jour-heure).sql (voir .csv) dans le répertoire /store/todo/
    cron chaque 12 heures: si fichier avec extension .xxx existe dans répertoire (quel que soit son nom), l'importe et le supprime - si erreur alors change extension en ".erreur" et envoi email

    Ici, la seule difficulté est en local :
    - de ne pas refaire un upload de datas déjà envoyées (ou bien reprendre sur erreur) : après upload, créer un curseur "last envoi" (datetime ou last id ?)
    - traitement d'un éventuel fichier .erreur ? je suppose un traitement manuel ...
    $moi= ( !== ) ? : ;

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Sur ce serveur mutualisé OVH vous pouvez sans doute faire tourner des scripts PHP. N'est-il envisageable de monter une petite API exposée comme un service web, avec authentification ?

    Ou un truc un peu plus "sale": si phpMyAdmin est déjà dispo, alors vous pouvez sans doute automatiser le login et ajout dans la DB avec Curl ou Python requests par exemple. Bon c'est pas génial, mais quitte à faire du bricolage il y a des possibilités.

    Ou alors, prenez un autre type de serveur et faites de la vraie réplication de base de données. Ca ne doit pas être un serveur dédié coûteux mais ça peut être un VPS.

  5. #5
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    la base de données est de quel type ? mariadb ? postgresql ? mysql ? autre ?
    pas moyen de communiquer avec par du code (php ou autre) dans un serveur web ?
    Ami calmant, J.P
    Bonjour à toi et à tous,

    C'est bien du mysql des 2 côtés.
    Le distant est sur un espace mutualisé chez OVH, sans possibilité d'accès à distance. Sans frais supplémentaires, je ne peux avoir qu'une seule BD.

    Alors, voici mon idée :
    1. À la fin du script donné en #1, je propose de créer un fichier SQL ou CSV avec les 7 derniers records que j'exporte vers mon serveur distant.
    2. Et sur mon serveur distant j'insère ces enregistrements. Comme la clé primaire est déclarée sur la date, seuls les nouveaux enregistrements seront insérés, théoriquement le dernier, les autres devant être ignorés et provoquer une erreur.


    Pour le moment, c'est sur le point 1 que j'ai besoin de votre avis et de votre aide
    Pour le point 2, je dispose d'un cron et je crois que le + simple serait d'utiliser un script php ? Mais je vais regarder comment mettre en oeuvre le Python sur mon espace mutualisé, qui est de base de base.

    Un grand merci pour votre aide !

    Voici la structure de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    -- phpMyAdmin SQL Dump
    -- version 5.2.0
    -- https://www.phpmyadmin.net/
    --
    -- Hôte : localhost
    -- Généré le : ven. 24 fév. 2023 à 15:46
    -- Version du serveur : 10.3.36-MariaDB-0+deb10u2
    -- Version de PHP : 7.3.31-1~deb10u2
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    START TRANSACTION;
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8mb4 */;
     
    --
    -- Base de données : `weewx`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Structure de la table `t_quotidien`
    --
     
    CREATE TABLE `t_quotidien` (
      `q_date` date NOT NULL,
      `q_temp` float DEFAULT NULL,
      `q_temp_hi` float DEFAULT NULL,
      `q_temp_low` float DEFAULT NULL,
      `q_hum_out` float DEFAULT NULL,
      `q_bar` float DEFAULT NULL,
      `q_rain` float DEFAULT NULL,
      `q_rain_rate` float DEFAULT NULL,
      `q_tpe` float DEFAULT NULL,
      `q_dj_18` float DEFAULT NULL,
      `q_dj_16` float DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
     
    --
    -- Index pour les tables déchargées
    --
     
    --
    -- Index pour la table `t_quotidien`
    --
    ALTER TABLE `t_quotidien`
      ADD PRIMARY KEY (`q_date`);
    COMMIT;
     
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Blaise Voir le message
    Un grand merci pour votre aide !
    Pas grand chose là dedans concerne le langage Python... Et si le soucis est la conception d'une application PHP (qui exécuterait un script Python) autant demander de l'aide dans le bon forum.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [Lazarus] Ajout d'un enregistrement dans une base MySQL
    Par ALT dans le forum Lazarus
    Réponses: 15
    Dernier message: 27/07/2015, 16h29
  2. MàJ/ajout d'un enregistrement dans une base de données mySQL
    Par BMT_Benoît dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/08/2007, 08h02
  3. Gestion internet des enregistrements d'une base sur un serveur
    Par Monbasinstinct dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/07/2007, 00h28
  4. Réponses: 7
    Dernier message: 07/06/2006, 07h32
  5. AJOUT d'un ENREGISTREMENT dans UNE TABLE
    Par ramo dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/08/2005, 16h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo