Lintero MySQL: Lettere un pacchetto python installato Integrazione con un modulo python scritto dall'utente

0

Sto lavorando su un nuovo stile di sistema di migrazione del database che sta procedendo bene. C'è un ultimo aspetto che voglio finire, ovvero abilitare il linting di MySQL. Per lo sfondo, questo è un po 'diverso rispetto ai sistemi di migrazione standard forniti con es. laravel, django, ecc. Invece di specificare le azioni per migrare il database da uno stato a quello successivo, il sistema è guidato da .sql file che contengono un'istruzione CREATE TABLE che fornisce la struttura desiderata per ogni tabella. Il mio sistema di migrazione legge quindi questi file per determinare come dovrebbe essere il database, legge il database per vedere come appare e genera ALTER TABLE comandi per far corrispondere l'uno all'altro.

Una grande funzionalità che voglio realizzare con questo è un po 'di linting sulla struttura del database stesso. In questo caso significa impostare regole per tipi di colonna, regole specifiche per l'applicazione, ecc ... Voglio dare l'"utente" (in questo caso, io e il mio team), il pieno controllo di quali siano queste regole. Solo per darti un'idea di ciò a cui sto mirando, ho in mente le regole del linting in questo modo:

  1. Qualsiasi colonna che rappresenta una chiave esterna (identificata da un nome di colonna che termina con _id ) dovrebbe avere un vincolo di chiave esterna effettivo su di essa.
  2. Qualsiasi colonna con una chiave esterna dovrebbe avere un nome di colonna che termina con _id )
  3. Alcuni tipi di colonna non sono consentiti ( enum , boolean , altri)

Ho visto altri sistemi di sfilacciatura che offrono opzioni configurabili (quanti spazi tra paren aperto e identificatori, ecc.). Tuttavia, sto cercando di creare un sistema di linting completamente configurabile, in quanto questi sono i tipi di regole che possono facilmente cambiare da applicazione a applicazione o da team a team. Il mio sistema legge attualmente la struttura dei file del database in alcuni oggetti python con un'API chiara. Di conseguenza, sto pensando di far funzionare il sistema di linting in questo modo:

  1. Il linter di migrazione viene eseguito dalla riga di comando.
  2. Il sistema di migrazione
  3. analizza i file * .sql e determina la struttura del database, memorizzando ciascuna tabella in un oggetto conveniente
  4. L'utente specifica il nome di un modulo python che riceverà questi oggetti.
  5. Il sistema di migrazione
  6. carica il modulo e, tramite un'API standardizzata, passa le tabelle in un attimo (o più alla volta se necessario), in modo che il modulo dell'utente possa elaborare le tabelle e restituire errori di linting definiti dall'utente
  7. Il sistema di migrazione restituisce eventuali errori di sfilacciamento alla riga di comando

Ovviamente un tale sistema può anche essere integrato in una pipeline di build. Il potenziale problema che prevedo con un tale sistema è che il modulo di linting dell'utente dovrà essere installato su tutte le macchine in cui deve essere eseguito. Ciò potrebbe costringere il team a gestire le implementazioni e gli aggiornamenti del modulo di linting se le regole dovessero cambiare, il che può certamente essere un problema. Un'altra opzione potrebbe essere quella di consentire all'utente di specificare una cartella in cui il sistema di migrazione trova il modulo di linting e lo importa da esso. In questo caso il modulo di linting potrebbe semplicemente sedersi nel repository del codice principale ed essere gestito / distribuito con tutto il resto.

Per riassumere, l'essenza del problema è che voglio che una parte della mia domanda sia scritta e sotto il pieno controllo dell'utente finale. Voglio renderlo il più semplice possibile per loro collegarlo alla mia applicazione. Mi sembra probabile che un buon modo per ottenere questo risultato è di permettere loro di specificare la posizione di un modulo Python sul loro sistema, specificando un'API chiara da seguire per quel modulo, e quindi aggiungendo manualmente quella posizione del modulo al percorso python in esecuzione -time e chiamandolo tramite l'API standardizzata. Qualcuno ha esperienza con qualcosa in questo senso? Qualche suggerimento su metodi che potrebbero funzionare meglio per l'utente finale?

    
posta Conor Mancone 13.11.2017 - 19:17
fonte

1 risposta

1

Penso che tu stia procedendo nella giusta direzione, puoi installare un modulo per lo sfilacciamento sulla tua applicazione di migrazione e poi controllare se è installato e l'utente vuole applicarlo durante la migrazione.

Hai un file di configurazione in cui inserisce il percorso del modulo di linting e una cartella delle regole di custodia che l'utente può applicare inserendo più regole come quelle basate su xml o json.

Quando applichi il linting e applichi le regole, controlli prima le regole personalizzate e poi applica le regole standard, se presenti.

In questo modo la tua applicazione può essere eseguita senza linting, con le regole di base che ti forniscono (ancora queste possono far parte dell'API o le regole di esempio che hai impostato) con e con le regole personalizzate create dall'utente quando si fa fuoco. Potrebbe essere necessario considerare quando l'utente desidera disinstallare e rimuovere il modulo di linting, raccogliendo le proprie regole personalizzate dal file di configurazione e chiedendo loro di eseguirne il backup o di rimuoverle. Condividerli sarebbe facile semplicemente copiandoli su una nuova macchina e abilitandoli tramite il file di configurazione.

Buona fortuna per il tuo lavoro.

    
risposta data 16.11.2017 - 13:39
fonte

Leggi altre domande sui tag