60 votes

Définir une valeur par défaut dans sqlalchemy

Je voudrais définir la valeur par défaut d'une colonne qui est basée sur une autre table dans mon modèle SQLAlchemy.

Actuellement, j'ai ceci :

Column('version', Integer, default=1)

Ce dont j'ai besoin est (en gros) ceci :

Column('version', Integer, default="SELECT MAX(1, MAX(old_versions)) FROM version_table")

Comment puis-je mettre cela en œuvre dans SQLAlchemy ?

55voto

voithos Points 15066

El documentation donne les possibilités suivantes pour default :

Un scalaire, un appelable Python ou un ClauseElement représentant la valeur par défaut de cette colonne, qui sera i. par défaut pour cette colonne, qui sera invoquée lors de l'insertion si cette colonne n'est pas spécifiée dans la clause VALUES de l'insertion.

Vous pouvez envisager d'utiliser une fonction simple, ou vous pouvez simplement utiliser une fonction select() objet .

Dans votre cas, peut-être quelque chose du genre :

from sqlalchemy.sql import select, func
...
Column('version', Integer, default=select([func.max(1,
    func.max(version_table.c.old_versions))]))

16voto

markmnl Points 3622

Vous voulez serveur_par_défaut

Column('version', Integer, server_default="SELECT MAX(1, MAX(old_versions)) FROM version_table")

2 votes

Existe-t-il un moyen de modifier cette méthode pour filtrer sur une valeur utilisée dans le cadre de l'insertion ? par exemple, select max(...) from table where table.some_field=some_value ? some_value est l'une des valeurs insérées. EDIT : malheureusement, il semble que non, postgres ne permet pas cela : "La valeur est toute expression sans variable (en particulier, les références croisées à d'autres colonnes de la table actuelle ne sont pas autorisées). Les sous-requêtes ne sont pas autorisées non plus."

0voto

jsnow Points 246

Si vous souhaitez utiliser une instruction DML pour générer le fichier default vous pouvez simplement utiliser l'option text pour indiquer que vous transmettez des données DML. Vous pouvez également avoir besoin d'un ensemble supplémentaire de parenthèses si le moteur veut écrire ceci à l'intérieur d'une balise VALUES clause, par exemple :

from sqlachemy import text
Column('version', Integer, default=text("(SELECT MAX(1, MAX(old_versions)) FROM version_table)"))

J'ai utilisé cette technique pour utiliser une séquence afin de remplacer la génération d'ID par défaut du serveur, par exemple :

Column('version', Integer, default=text("NEXT VALUE FOR someSequence"))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X