Aller au contenu

Recherche full-text dans toute la db... avec grep

·189 mots·1 min

Je n’en suis franchement pas fier parce que c’est tout sauf propre et réutilisable, mais cela pourrait peut-être à nouveau servir à l’occasion…

Le script ci-dessous lit l’ensemble d’une base de données en utilisant pyodbc et écrit leur contenu dans un fichier texte, nommé d’après la table dont elles sont issues. En mode bourrin, en somme, puisque

  • On liste toutes les tables
  • On fait ensuite un select sur chacune d’entre elles
  • Pour ensuite dumper le contenu dans un fichier texte.

Intérêt? Exécuter un grep -rin par la suite sur les fichiers écrits.

import pyodbc

CXSTR = 'DRIVER={SQL Server};SERVER=...;DATABASE=...;UID=...;PWD=...;'

if __name__ == '__main__':

    cnxn = pyodbc.connect(CXSTR)
    cursor = cnxn.cursor()

    cursor.execute(
        """
        SELECT
            *
        FROM information_schema.tables
        WHERE TABLE_TYPE='BASE TABLE'
        """
    )
    for row in cursor.fetchall():
        cursor2 = cnxn.cursor()
        cursor2.execute("Select * From " + row[2])

        print('using {}'.format(row[2] + '.txt'))
        with open(row[2] + '.txt', 'wt', encoding='utf-8') as f:
            for row2 in cursor2.fetchall():
                f.write(str(row2))

Quand je disais qu’il y avait moyen de faire plus propre… 😢 Allez, pour le fun: le script s’en sort avec un score PyLint de 2.67/10 (missing docstring, invalid name, lines too long, no member et anomalous backslash in string).