3 votes

Comment appeler une procédure stockée avec SQLAlchemy qui nécessite un paramètre de table de type défini par l'utilisateur ?

J'ai une procédure stockée sur le serveur MSSQL, "prc_add_names", qui prend un paramètre de valeur de table. Le paramètre lui-même est d'un type personnalisé "StringTable" défini comme suit :

CREATE TYPE [dbo].[StringTable] AS TABLE([strValue] [nvarchar](max) NULL)

Je n'ai aucune idée de la manière d'exécuter cette procédure à l'aide de SQLAlchemy. J'ai l'habitude d'appeler des procédures avec des arguments en utilisant session.execute comme ça :

result = session.execute('prc_do_something :pArg', {pArg:'foo'})

Cependant, cela ne fonctionne pas si je passe simplement une liste de chaînes de caractères comme argument :

result = session.execute('prc_add_names :pArg', {pArg: ['Name One', 'Name Two']})

ce qui conduit à :

sqlalchemy.exc.ProgrammingError: (pymssql.ProgrammingError) (102, "Incorrect syntax near 'Name One'.DB-Lib error message 20018, severity 15:
General SQL Server error: Check messages from the SQL Server
") [SQL: 'prc_add_names %(pArg)s'] [parameters: {'pArg': ['Name One', 'Name Two']}] (Background on this error at: http://sqlalche.me/e/f405)

Il est évident que SQLAlchemy ne comprend pas que ma liste de chaînes de caractères est une tentative de création d'un argument de type StringTable, mais après quelques heures de recherche sur Internet et de lecture de la documentation, je n'ai pas compris comment je devais gérer cela.

Pour votre information, je n'ai pas le contrôle de cette base de données, il n'est donc pas possible de modifier la procédure stockée ou quoi que ce soit d'autre.

EDIT : Je ne suis pas marié à SQLAlchemy. S'il existe une autre bibliothèque qui peut gérer cela, je serais heureux de l'utiliser à la place.

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