Lister les tables et colonnes d'une base Sqlite

Partagez votre expérience de PureBasic avec les autres utilisateurs.
yves86
Messages : 36
Inscription : sam. 26/juil./2008 17:13
Localisation : Poitou

Lister les tables et colonnes d'une base Sqlite

Message par yves86 »

Bonjour,
Voici un code qui liste les tables et les colonnes avec leurs caractéristiques, d'une base Sqlite.
Le nom des colonnes et ses caractéristiques se trouvent dans le sql de création de la table.

Code : Tout sélectionner

Enumeration 
  #Bdd
EndEnumeration

UseSQLiteDatabase()

Macro Db_query(bdd,T_sql)
  If Not DatabaseQuery(bdd,T_sql)
    MessageRequester("Erreur SQL",T_sql + #LF$ + #LF$ +DatabaseError())
    End
  EndIf
  
EndMacro

Structure champs
  Nom_colonne.s
  Type.s
  Cle.b
EndStructure

Global NewList colonnes.champs()

Structure bdd
  Nom_table.s
  List colonne.champs()
EndStructure

Global NewList Tables.bdd()

File_bdd$ = OpenFileRequester("Base de données","","Base de données (sqlite,db)|*.sqlite;*.db|Tous fichiers (*.*)|*.*",0)
If File_bdd$ <> ""
  OpenDatabase(#Bdd,File_bdd$,"","")
  T_sql$ = "SELECT name, sql FROM Sqlite_master WHERE Type = 'table' ORDER BY name"
  Db_query(#Bdd,T_sql$)
  While NextDatabaseRow(#Bdd)
    AddElement(Tables())
    Tables()\Nom_table = GetDatabaseString(#Bdd,0)
    L0$ = ReplaceString(GetDatabaseString(#Bdd,1),#CR$,"")
    L0$ = ReplaceString(L0$,#LF$,"")
    L0$ = ReplaceString(L0$,Chr(34),"")
    L0$ = ReplaceString(L0$,Chr(96),"")
    If CountString(L0$,"(") > 1
      Tmp_colonne.s = Trim(StringField(L0$,3,"("),")")
    EndIf
    L1$ = Trim(StringField(L0$,2,"("))
    L1$ = Trim(StringField(L1$,1,")"))
    ClearList(colonnes())
    P_key = #False
    For i = 1 To CountString(l1$,",") + 1
      L2$ = Trim(StringField(L1$,i,","))
      If CountString(L2$," ") > 0
        L3$ = Trim(StringField(L2$,1," "))
        L4$ = Trim(StringField(L2$,2," "))
      ElseIf CountString(L2$,#TAB$) > 0
        If CountString(L2$,#TAB$) > 1
          Field = 2
        Else
          Field = 1
        EndIf
        L3$ = Trim(StringField(L2$,Field,#TAB$))
        L4$ = Trim(StringField(L2$,Field + 1, #TAB$))
      EndIf
      If L3$ = Tmp_colonne
        P_key = #True
      ElseIf FindString(L2$,"PRIMARY KEY") > 0 And P_key = #False
        P_key = #True
      Else
        P_key = #False
      EndIf
      If FindString(L3$,"PRIMARY") = 0
        AddElement(colonnes())
        colonnes()\Nom_colonne = L3$
        colonnes()\Type = L4$
        colonnes()\Cle = P_key
      EndIf
    Next
    SortStructuredList(colonnes(),#PB_Sort_Ascending|#PB_Sort_NoCase,OffsetOf(champs\Nom_colonne),#PB_String)
    ForEach colonnes()
      AddElement(Tables()\colonne())
      Tables()\colonne() = colonnes()
    Next
  Wend  
  FinishDatabaseQuery(#Bdd)
  ForEach Tables()
    Debug Tables()\Nom_table
    ForEach Tables()\colonne()
      Debug #TAB$ + "> " + LSet(Tables()\colonne()\Nom_colonne,30) + #TAB$ + LSet(Tables()\colonne()\Type,20) + #TAB$ + Str(Tables()\colonne()\Cle)
    Next
  Next
EndIf


Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lister les tables et colonnes d'une base Sqlite

Message par falsam »

Et pour plus de détail : SQlite Explorer https://www.purebasic.fr/french/viewtop ... 60#p177460
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
yves86
Messages : 36
Inscription : sam. 26/juil./2008 17:13
Localisation : Poitou

Re: Lister les tables et colonnes d'une base Sqlite

Message par yves86 »

Merci pour ton info, je n'avais pas vu ce post.
Répondre