2009-10-01 4 views
1

J'essaie de créer un système en Python dans lequel on peut sélectionner un nombre de lignes à partir d'un ensemble de tables, qui doivent être formatées dans un utilisateur. manière définie. Disons que la table a a un ensemble de colonnes, dont certaines incluent une valeur date ou timestamp. Le format défini par l'utilisateur pour chaque colonne doit être stocké dans une autre table et interrogé et appliqué sur la requête principale au moment de l'exécution. Permettez-moi de vous donner un exemple: il existe différentes façons de mettre en forme une colonne de date, par ex. en utilisantMise en forme de colonne dynamique en SQL - et un backend pour stocker le formatage

SELECT to_char(column, 'YYYY-MM-DD') FROM table; 

dans PostgreSQL. Par exemple, j'aimerais que le deuxième paramètre de l'intégré to_char() soit interrogé dynamiquement à partir d'une autre table à l'exécution, puis appliqué s'il a une valeur. Lire la définition d'une table en tant que telle n'est pas vraiment un problème, plutôt que de créer un schéma de base de données qui recevrait des données d'une interface utilisateur à partir de laquelle un utilisateur peut sélectionner les instructions de formatage à appliquer aux différentes colonnes. L'utilisateur devrait être en mesure de choisir l'ensemble des colonnes de l'utilisateur à inclure dans la requête de l'utilisateur, ainsi que la mise en forme définie par l'utilisateur pour chaque colonne.

Cela faisait quelques jours que je pensais à le faire d'une manière élégante et efficace, mais en vain. Avoir l'utilisateur mis dans la définition désirée de l'utilisateur dans un champ de texte et l'inclure dans une requête serait à peu près générer une invitation pour les attaques par injection SQL (bien que je puisse utiliser les fonctions escape()), et stocker toutes les combinaisons possibles ne me semble pas faisable non plus.

Répondre

0

Il me semble un stored procedure ou un sous-select fonctionnerait bien ici, bien que je ne l'ai pas testé. Disons que vous stockez un date_format pour chaque utilisateur dans le tableau users.

SELECT to_char((SELECT date_format FROM users WHERE users.id=123), column) FROM table; 

Votre consommation peut varier.

+0

Salut patcoll, merci pour votre réponse. Cela semble vraiment prometteur. Je vais essayer. Ce qui reste est le problème de stocker un nombre différent de colonnes avec des formats différents pour chaque utilisateur. – fucx

0

Tirez les dates comme timestamp UNIX et les formater en Python:

SELECT DATE_PART('epoch', TIMESTAMP(my_col)) FROM my_table; 

my_date = datetime.datetime.fromtimestamp(row[0]) # Or equivalent for your toolkit 

J'ai trouvé quelques avantages à cette approche: timestamp unix sont les plus économes en espace format commun (cette approche est la langue que vous interrogez dans la base de données est plus riche que la base de données sous-jacente, vous donnant beaucoup d'options si vous commencez à faire un formatage plus convivial comme "aujourd'hui", "hier", "la semaine dernière", " 23 juin ". Je ne sais pas quel type d'application vous développez mais si c'est quelque chose comme une application web qui sera utilisée par plusieurs personnes, je pense aussi stocker vos valeurs de base de données en UTC afin que vous puissiez appliquer spécifique à l'utilisateur paramètres de fuseau horaire lors du formatage sans avoir à les prendre en compte pour toutes vos opérations de base de données.

+0

Salut Chris, merci pour votre réponse. Je suis sûr que PostgreSQL est capable de stocker des horodatages avec le fuseau horaire, ce qui créerait aussi un format universel pour les stocker. En outre, «aujourd'hui», «hier», «demain», etc. sont tous des types d'entrée de date pris en charge dans PostgreSQL. Mon problème principal est toujours de stocker et de récupérer la définition de format dans une table. – fucx

+0

Ok - Je recommande généralement de ne pas mettre en forme la base de données, mais sinon, la suggestion de patcoll est plus proche de ce que vous voulez. –