Nella libreria di astrazione del database sto estendendo la sintassi delle istruzioni preparate SQL per suggerire un parser con tipo letterale previsto. Lo considero un miglioramento molto essenziale, il mio ragionamento è possibile leggere qui . Se vuoi mettere in discussione l'idea stessa, per favore fammelo sapere nei commenti: vorrei iniziare un'altra domanda invece di mescolarla qui.
Il consiglio che voglio è sulla sintassi. Sono abbastanza ignorante di tutte le lingue e dialetti accanto a php e mysql, e potrebbe esserci già una soluzione per scopi generali di cui non sono a conoscenza. In caso contrario, desidero conoscere la tua opinione personale o il tuo suggerimento.
Al momento, solo i segnaposto posizionali supportati. Tuttavia mi è stato chiesto più volte di aggiungere il supporto per i nomi. Tuttavia, non posso decidere quale sintassi scegliere per quello.
Al momento contrassegno un punto interrogativo convenzionale con una singola lettera, cioè ?s
- stringa, ?i
- int, ?n
- nome (identificatore) e così via.
Tuttavia per il segnaposto nominato (stile :name
) l'unica opzione ragionevole per me è
i:name
o, se decido di aggiungere altri modificatori dettagliati, anche
int:name
quindi, la query sarà simile a
SELECT * FROM ident:table WHERE id IN (int:id)
La domanda è: vedi qualche inconveniente per una tale sintassi? Hai un suggerimento per qualsiasi altro stile? Pensi che sia leggibile?
Un'altra domanda è sul ripetere le cose. Al momento ho due segnaposto per gli array - ?a
per la lista di stringhe separate da virgole e ?u
per le coppie ?n=?s
. Mi infastidisce già da molto tempo, che una tale sintassi è superflua, ma insufficiente. Cosa succede se ho bisogno di un set di identificatori separati da virgola? O anche una dichiarazione complessa come l'intera clausola VALUES? Con una sorta di operatore di ripetizione, posso rendere la query SQL estremamente migliorata. Ecco alcuni esempi di ciò a cui sto pensando:
SELECT * FROM table WHERE id IN([?i])
SELECT [?n] FROM table
INSERT INTO table VALUES [(?i,?s,?s,?s)]
UPDATE table SET [?n=?s]
Come puoi vedere, utilizzo parentesi quadre per designare una ripetizione. Tuttavia, non sono ancora sicuro se dovrei usarli. La prima obiezione è che si scontreranno con la sintassi dell'identificatore del server SQL. Il prossimo è piuttosto filosofico: è un altro elemento di sintassi e voglio introdurre meno modifiche possibili alla sintassi.
Inoltre, questa sintassi richiederà una logica di analisi molto più complicata, che sto cercando di evitare anche io. Quindi - un'altra opzione è solo per estendere il set di tipi, sia con segnaposti distinti come ?k
per l'elenco di numeri, ?o
per l'elenco di identificatori, che con l'aggiunta di un singolo = modificatore di lettera al tipo esistente come ?as
(o ?astr
o astr:name
) è un array di stringhe, ?an
e simili.
C'è un'altra opzione - per rilevare automaticamente le ripetizioni. Se abbiamo uno scalare, formattalo come un singolo valore. Se arriva la matrice, formatta come un elenco separato da virgole. Tuttavia, molte persone ritengono questo approccio inaccettabile, in quanto può portare a risultati imprevedibili e query errate (comunque comunque sicure). Sono ancora in dubbio se posso scegliere in questo modo.