2017-10-03 3 views
1

MariaDB permet dynamic columns, qui sont des ensembles de données peu peuplés auxquels accèdent les fonctions COLUMN_ADD() et COLUMN_GET().L'utilisation de COLUMN_GET() de MariaDB dans SQLAlchemy

Cependant, nous ne pouvons pas trouver un moyen d'utiliser des colonnes dynamiques avec SQLAlchemy. Nous avons essayé:

from sqlalchemy.sql import func 

... 

query = session.query(
    func.COLUMN_GET(DynamicInfo.dyn_col, 256) 
).filter(
    DynamicInfo.index_id == index 
) 

qui produit l'instruction SQL suivante:

SELECT COLUMN_GET(dyn_info.dyn_col, %(COLUMN_GET_2)s) AS `COLUMN_GET_1` 
FROM dyn_info 
WHERE dyn_info.index_id = %(index_1)s 

Le problème est que cette syntaxe est non valide pour COLUMN_GET(); il doit inclure le type ainsi que la valeur. Nous ne pouvons pas comprendre comment obtenir COLUMN_GET(dyn_info.dyn_col, 256 AS INT), sans écrire le SQL nous-mêmes (ce qui annulerait la plupart des avantages de l'utilisation de l'alchimie SQL en premier lieu).


Nous avons aussi regardé beaucoup de code source SQLAlchemy sur la façon dont les colonnes sont traitées, dans l'espoir que nous pourrions copier ce format et ont des comparateurs personnalisés définis. Le problème réside dans le fait que les colonnes dynamiques requièrent le paramètre d'index lorsqu'elles sont appelées, ce qui rendrait la définition de la fonction COLUMN_GET() de loin la solution la plus simple/la plus propre.

Répondre

1

Cette réponse peut être rendue obsolète par le développement futur de SQLAlchemy, mais j'ai trouvé utile de construire mes propres éléments de clause en utilisant des moyens SQLAlchemy. Peut-être, le meilleur exemple peut être trouvé à partir du projet sqlalchemy-fulltext-search. En le sous-classant ClauseElement et le compilant, on peut faire presque tous les ajouts à l'arsenal SQLAlchemy, pas seulement des fonctions. L'exemple montre également comment classer les classes si nécessaire (dans l'exemple lié, pour définir un index spécial).

De la même façon, on peut ajouter des syntaxes spécifiques au dialecte. Je pense, vous trouverez tous les ingrédients nécessaires pour votre cas.

Bien sûr, SQLAlchemy permet de passer n'importe quel texte SQL, mais je suppose que la syntaxe Pythonic est ce qui est intéressant ici.

+1

Je venais juste de finir ça! Pour nos besoins, il était plus propre de créer notre propre 'Function', mais la seule différence est qu'il a une gestion spéciale de' ClauseElement'. Merci pour la réponse, cependant. – Kittsil