9
votes

Échapper des caractères spéciaux à l'aide de SQLalchemy

Je stocke des noms de fichiers et des filePaths dans MySQL. Les récupérer de la base de données à l'aide de l'expression similaire nécessite que j'échappais tous les caractères nomencents autorisés qui entrent en collision avec des caractères spéciaux MySQL. Je suis heureux de simplement utiliser la méthode String.replace de Python (), mais je me demandais s'il y avait une méthode plus standard ou intégrée de désinfection de filépathes avec SQLalchemy ou de faire face à des filechages dans MySQL en général.

Edit: Un peu plus d'informations. J'ai besoin que la solution soit os-agnostique et établie. Il n'a pas besoin d'être mis en œuvre dans SA. Je vais accepter toute procédure d'encodage qui fonctionne. Sauvegarde que j'ai besoin d'une liste de tous les caractères qui doivent être échappés et un choix intelligent d'un caractère d'évacuation.


0 commentaires

4 Réponses :


-2
votes

Pourquoi avez-vous besoin d'échapper aux chemins de fichiers? Dans la mesure où vous n'écrivez pas manuellement SELECT / Insérer des requêtes, SQLalchemy prendra soin de l'échappement lorsqu'il génère la requête en interne.

Les chemins de fichiers peuvent être insérés au fur et à mesure de leur inscription dans la base de données.


2 commentaires

J'utilise la méthode () SA pour sélectionner des filechages. Lequel (comme je comprends) utilise % et _ (y a-t-il d'autres?) Comme des caractères génériques. Les deux sont également valides Chrrs de fichier de fil. Il serait certainement étrange si SA pouvait lire mon esprit et savoir quand j'utilisais _ en tant que recherche wildcard contre un caractère littéral dans un nom de fichier et "prendre soin de soin" de moi! :)


@Toofan: Paul a raison: Sqlalchemy ne fera pas cela pour .ike. Blasy () et des consomptes ( .Contains () , . Code. > etc ...). Il fournit un argument échappement pour ces méthodes, mais vous devez échapper à la chaîne vous-même et fournir le caractère d'échappement utilisé.



0
votes

sqlalchemy do Sanitize pour vous si vous utilisez des requêtes régulières. Peut-être que le problème que vous utilisez comme la clause. Comme nécessitent une fuite d'addition pour ces symboles: _%. Ainsi, vous aurez besoin de remplacer des méthodes si vous souhaitez citer comme expression.


2 commentaires

Le fait que j'utilise .ike () n'est pas le problème, c'est la principale exigence. Dois-je seulement n'échapper % et _ ? Comment gérer des citations, des crochets et des backslashes littéraux?


Vous devez échapper à seulement 3 caractères, _,%, /. _ et% sont des cartes génériques / - Symbole d'échappement. Une autre partie de la requête sera désinincitée automatiquement



-4
votes

Vous n'avez pas besoin de faire quoi que ce soit SQLalchemy le fera pour vous.


8 commentaires

Lisez les commentaires ici: Stackoverflow.com/ Questions / 6713715 / ...


Ensuite, vous devez écrire votre fonction d'évacuation par vous-même: chemin.replace ('%', '\\%'). Remplacer ('_', '\ _')


Ou vous pouvez utiliser SQL comme alors: Sélectionnez * à partir de la table où un «Andre *%» d'Andre * ';


Pour cela, dans Sqlalchemy, il y a un opérateur de colonne comme avec la définition: comme (Autre, Escape = Aucune) SQLALCHEMY.ORG/DOCS/CORE/...


Oui, et maintenant, vous voyez mon problème avec FilePaths. La barre oblique inverse est une CHR dans chaque fenêtres FilePath. Trouver un caractère d'évacuation qui n'est pas un caractère valide dans certains fichiers-système est un problème. Dois-je échapper à ' et "" et divers supports? Comme mes questions posées, je suis heureux de faire le .replace () que vous suggérez, mais je cherchais un Solution de la meilleure pratique, courante ou bien pensée pour les filechages dans MySQL en général.


Vous n'avez pas besoin d'échapper au citations SA échappera à la soi-même, échappera à la paramétrage de même que l'opérateur nécessaire pour échapper aux caractères spéciaux pour une expression similaire.


Si vous avez besoin d'utiliser% ou _ ou * en même temps que de char et de caractères spéciaux, vous devez écrire la fonction ECPAE par vous-même


Le principal problème que vous avez est que vous enregistrez votre chemin qui ne s'est pas échappé, puis lorsque vous essayez d'utiliser comme si vous avez des problèmes comme ça.



-3
votes

Comme je sais qu'il n'y a pas ce que vous recherchez dans Sqlalchemy. Il suffit d'aller basestring.replace () méthode par vous-même.


1 commentaires

Oui. Je connais. Je dis cela dans ma question. Que dois-je remplacer? N'est-ce pas '*' et '\' nom de fichier de fichier Linux valide? N'y a-t-il pas un encodage standard que je devrais utiliser? J'ai envisagé de faire un encode URL mais avec un refuré ou un double% au lieu d'un%, mais cela se désordonne rapidement. Je cherche une solution favorisée.