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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chomeur
    Inscrit en
    Mai 2022
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Mai 2022
    Messages : 88
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 : Février 2006
    Messages : 12 835
    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
    Membre confirmé
    Homme Profil pro
    chomeur
    Inscrit en
    Mai 2022
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Mai 2022
    Messages : 88
    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???

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 : Février 2006
    Messages : 12 835
    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]

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    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

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    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 323
    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"

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

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    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.

  10. #10
    Membre confirmé
    Homme Profil pro
    chomeur
    Inscrit en
    Mai 2022
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Mai 2022
    Messages : 88
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Septembre 2013
    Messages
    2 323
    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 323
    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

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, 11h44
  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, 15h37
  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, 14h24
  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, 13h30
  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, 13h27

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