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

Python Discussion :

python et SQL : créer une table depuis un csv et définir le type des colonnes


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    May 2022
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : May 2022
    Messages : 78
    Points : 37
    Points
    37
    Par défaut python et SQL : créer une table depuis un csv et définir le type des colonnes
    Bonjour

    j'aimerai exploiter une base de données évec python
    Je sais me connecter à une base postgre par exemple, ou alors utilser sqlite.
    je sais donc créer des tables, faire des requetes etc..., des trucs basiques

    Maintenanrt, j'ai une table csv avec plein de colonnes.
    j'aimerai créer une table SQL à parti de ce csv.

    Si je devais le faire comme je sais faire, le taperai la commande à la main pour créer à la table, et je rentre un par un le nom des colonnes.

    j'ai vu qu'il est possible de charger le csv et de créer une table qui va se baser sur le nom des colonnes du csv.

    Ma question est comment est-ce que je peux maitriser le type des colonnes.
    genre un colonne du csv qui aque des entiers sera défini avec un type INT?
    Si c'est le cas, et qu'en fait je veux que nombres soit considérés comme du string, comment je peux faire?

    je dois changer un par un les colonnes qui sont concernées?

    merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    February 2006
    Messages
    12 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : February 2006
    Messages : 12 317
    Points : 30 053
    Points
    30 053
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par marietar Voir le message
    j'ai vu qu'il est possible de charger le csv et de créer une table qui va se baser sur le nom des colonnes du csv.
    Tu as vu ça où ? Dans quel contexte ? Avec quel outil ?

    Citation Envoyé par marietar Voir le message
    Si c'est le cas, et qu'en fait je veux que nombres soit considérés comme du string, comment je peux faire?
    Comme pour Excel: tu rajoutes une quote simple devant ton nombre. Ou alors (si l'outil ne sait pas traiter) tu places ton nombre entre deux quotes simples/doubles.

    Citation Envoyé par marietar Voir le message
    je dois changer un par un les colonnes qui sont concernées?
    Ah ben probablement. Il n'y a pas de magie. Si l'outil comprend "nombre=int" alors il ne faut pas qu'il voie du nombre. Accessoirement, sous Postgres, il y a plein d'int différents (shortint, integer, bigint). Donc même quand on a vraiment des nombres, l'association "nombre=int" n'est pas forcément adéquate.

    Personnellement je n'aime pas les "outils automatiques". Je veux créer une table qui doit bouffer de la data, je me creuse le citron puis je crée réellement ma table. Ce qui me permet de l'affiner au mieux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : June 2008
    Messages : 20 976
    Points : 36 170
    Points
    36 170
    Par défaut
    Salut,

    Citation Envoyé par marietar Voir le message
    je dois changer un par un les colonnes qui sont concernées?
    "123" pourra être un int, un float ou une chaine de caractères. Le plus simple sera d'avoir l'association entre nom de colonne et son type pour fabriquer la table. Plus compliqué sera de regarder toutes les valeurs d'une colonne pour décider si on peut la considérer comme float ou int.

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

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    September 2013
    Messages
    1 944
    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 : September 2013
    Messages : 1 944
    Points : 4 094
    Points
    4 094
    Par défaut
    bonjour
    Le plus simple sera d'avoir l'association entre nom de colonne et son type pour fabriquer la table
    Tout à fait !
    une solution "simple" (par forcément toujours possible) est d'éditer ton csv et de modifier la première ligne d'entête, puis de la décomposer pour assigner un type sql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom,prenom,age,
    # on passe en
    nom:text,prenom:text,age:integer,
    Et si il ne faut pas modifier le fichier, on peut aussi parfois passer en paramètres au script les types

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    script.py fichier.cvs --types="text,text,integer"
    $moi= ( !== ) ? : ;

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    May 2022
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : May 2022
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Tu as vu ça où ? Dans quel contexte ? Avec quel outil ?

    je crois que j'ai lu trop vite ma source d'info

    genre avec sqlite, j'avais cette commande:
    import c:/sqlite/city.csv cities
    Mais je viens de voir que au préalable, je dois créer la table et entrer les colonnes une par une.


    que ce soit avec sqllite, duckcb, sql server ou autres, on doit donc forcément définir les noms des colonnes une par une???

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    February 2006
    Messages
    12 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : February 2006
    Messages : 12 317
    Points : 30 053
    Points
    30 053
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marietar Voir le message
    Mais je viens de voir que au préalable, je dois créer la table et entrer les colonnes une par une. $


    Citation Envoyé par marietar Voir le message
    que ce soit avec sqllite, duckcb, sql server ou autres, on doit donc forcément définir les noms des colonnes une par une???
    Ben oui. Dans les "bases de données" c'est un peu la... base...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : June 2008
    Messages : 20 976
    Points : 36 170
    Points
    36 170
    Par défaut
    Citation Envoyé par marietar Voir le message
    que ce soit avec sqllite, duckcb, sql server ou autres, on doit donc forcément définir les noms des colonnes une par une???
    C'est vrai pour les bases de données relationnelles... mais il y a aussi des bases de données noSQL (qui ne sont pas basées sur un modèle relationnel).

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

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    September 2013
    Messages
    1 944
    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 : September 2013
    Messages : 1 944
    Points : 4 094
    Points
    4 094
    Par défaut
    Citation Envoyé par marietar Voir le message
    on doit donc forcément définir les noms des colonnes une par une???
    Et où est le problème ? python est fait pour coder, il suffit de coder (écrire 10 lignes, c'est aussi rapide que de demander et redemander dans un forum)
    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
    fichier = "toto.csv"
    entetes = {}
    with open(fichier, "r") as fcsv:
        reader = csv.DictReader(fcsv, delimiter=';')
        entetes = {e: "TEXT" for e in reader.fieldnames}
     
    if not entetes:
        exit(1)
     
    cmd = ""
    for entete in entetes:
        cmd += f"'{entete}' {entetes[entete]}, "
    sql = f"CREATE TABLE IF NOT EXISTS toto ({cmd[:-2]});"
     
    print(sql)
    sans la gestion des types
    $moi= ( !== ) ? : ;

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    July 2006
    Messages
    3 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : July 2006
    Messages : 3 451
    Points : 6 300
    Points
    6 300
    Par défaut
    Hello,

    Pandas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df = pd.read_csv('mon_csv.csv', dtype=types)
    types est le dictionnaire des types de chaque colonne que l'on souhaite caster (voir doc).

    et puis par la suite on crée une table ou on là modifie avec la méthode to_sql.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    May 2022
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : May 2022
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Re
    j'ai vu ce lien:
    https://www.sqlitetutorial.net/sqlite-import-csv/

    apparemment on peut charger un csv sans créer la table en définition les colonnes une par une.

    C'est pas bien de faire comme ca?

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

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

    Informations forums :
    Inscription : June 2008
    Messages : 20 976
    Points : 36 170
    Points
    36 170
    Par défaut
    Salut,

    Citation Envoyé par marietar Voir le message
    apparemment on peut charger un csv sans créer la table en définition les colonnes une par une.
    Relisez bien l'article:
    1. "on" c'est l'interface ligne de commande de sqlite,
    2. la table doit être préalablement créée...

    Citation Envoyé par marietar Voir le message
    C'est pas bien de faire comme ca?
    Un truc est "bien" à partir du moment où vous arrivez à le faire fonctionner et que ça produit le résultat souhaité.
    Dans le cas présent vous n'avez pas essayé... alors c'est peut être "bien" pour moi (je sais le faire fonctionner) mais comme il faut quand même créer la table, est-ce bien pour vous?

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

  12. #12
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    September 2013
    Messages
    1 944
    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 : September 2013
    Messages : 1 944
    Points : 4 094
    Points
    4 094
    Par défaut
    Citation Envoyé par marietar Voir le message
    j'ai vu
    On tourne en rond !
    Nous sommes un forum de "codeurs" pas un forum d'outils.

    Si tu désires coder ton script, on peut t'aider à condition que tu codes… pour l'instant, tu n'as même pas essayé
    Si tu recherches un outil, existe 999 outils, mais cela n'est pas un sujet python
    $moi= ( !== ) ? : ;

Discussions similaires

  1. Créer une table Qgis depuis un script python
    Par passby dans le forum Général Python
    Réponses: 6
    Dernier message: 30/08/2022, 12h44
  2. Créer une table depuis un couple père/fils
    Par exentro dans le forum SQLite
    Réponses: 1
    Dernier message: 10/03/2015, 16h37
  3. [SQL] créer une table de type innodb en php
    Par kluck3000 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/06/2007, 15h24
  4. [C# 2.0] Comment créer une table sur un serveur SQL 2000 ?
    Par Filippo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 15/09/2006, 14h30
  5. Créer une table DBase en langage SQL
    Par JeanMarc_T2k dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 04/09/2006, 14h27

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