2008-11-14 21 views
1

J'aimerais faire:Puis-je exécuter un HTTP GET directement en SQL sous MySQL?

UPDATE table SET blobCol = HTTPGET(urlCol) WHERE whatever LIMIT n; 

Y at-il un code disponible pour le faire? Je sais que cela devrait être possible car le MySQL Docs inclut un exemple d'ajout d'une fonction qui effectue une recherche DNS. MySQL/windows/De préférence sans avoir à compiler des choses, mais je peux.

(Si vous ne l'avez pas entendu parler de quoi que ce soit comme ça, mais vous attendre à ce que vous auriez si elle existait, un « Proly pas » serait bien.)

EDIT: Je connu cela ouvrirait un En revanche, dans mon cas, le seul accès à la base de données se fait via l'application console mysql. Ce n'est pas un système accessible au monde. Ce n'est pas un back-end web. C'est seulement un système local d'enregistrement de données

Répondre

2

Je ne connais aucune fonction comme celle-ci dans le cadre de MySQL. Essayez-vous simplement de récupérer les données HTML de plusieurs URL?

Une solution alternative pourrait être d'utiliser la fonction importHtml de la feuille de calcul de Google.

Google Spreadsheets Lets You Import Online Data

+0

Oui, je suis. Cependant, les données sont binaires donc pour cette raison (et d'autres) googel ne fonctionnera pas. – BCS

+0

Pour ce qu'il fait cependant, cela ressemble à une idée de fonctionnalité cool. – BCS

5

Non, Dieu merci - ce serait une horreur de sécurité. Chaque trou d'injection SQL dans une application pourrait être utilisé pour lancer des connexions de spam pour attaquer d'autres sites.

Vous pourriez, je suppose, l'écrire en C et le compiler comme un UDF. Mais je ne pense pas que cela vous apporte vraiment quelque chose en comparaison de simplement sélectionner dans votre couche d'application et faire une boucle sur les résultats en faisant des HTTP GET et UPDATEing. Si nous parlons de faire des connexions HTTP, l'efficacité supplémentaire de le faire dans la couche de base de données sera complètement éclipsée par les retards du réseau de toute façon.

+0

Le problème est que l'application select/loop/http get que vous proposez est le seul code extra-DB que j'ai dans le projet (BTW c'est ce que je fais en ce moment). Sans cela, le projet serait réduit à un seul composant, le DB lui-même. – BCS

+0

Je vois ... et le UDF personnalisé ne serait pas vraiment une amélioration non plus, car il serait lui-même un composant supplémentaire, et beaucoup plus ennuyeux à déployer que n'importe quel langage/outil que vous utilisez actuellement. – bobince

+0

Comme pour les autres SGBD qui pourraient le faire, Oracle a UTL_HTTP et vous pourriez probablement le faire à partir de SQL Server via un objet WinHttp. Encore une fois cependant, l'installation de l'un ou l'autre n'est pas entièrement pratique! – bobince

1

Proly pas. Les meilleures pratiques dans un environnement Web consistent à isoler les serveurs de base de données de l'extérieur, dans les deux sens, ce qui signifie que le serveur db ne serait pas autorisé à extraire des données d'Internet.

+0

un bon point, mais n/a dans mes cas, car ce n'est pas un environnement web plus que l'ordinateur de bureau moyen est (voir edit) – BCS

0

Proly pas.

Si vous êtes absolument déterminé à obtenir le contenu Web à partir d'un environ SQL, il y a autant que je connais deux possibilités:

  1. Ecrire une commande MySQL UDF en C (comme bobince mentionné). Cela pourrait être un énorme travail, en fonction de votre expérience de C, de la sécurité que vous voulez, de la façon dont vous voulez que l'UDF soit complet: par exemple. Just GET demandes? Que diriez-vous de POST? TÊTE?

  2. Utilisez une base de données différente que pouvez pour ce faire. Si vous êtes satisfait de SQL, vous pouvez probablement le faire avec PostgreSQL et l'un des langages snap-in tels que Python ou PHP.

Si vous n'êtes pas trop démenait coller avec SQL, vous pouvez utiliser quelque chose comme eXist. Vous pouvez faire ce type de chose relativement facilement avec XQuery, et vous bénéficieriez de la possibilité de modifier facilement les résultats pour les adapter à votre schéma (plutôt que de les regrouper dans un champ blob) ou de stocker la page en tant que doc xhtml dans la DB.

Ensuite, vous pouvez exécuter des requêtes très rapidement sur tous les documents pour, par exemple, obtenir tous les liens ou les citations ou quoi que ce soit. Vous pouvez même appliquer XSL à un tel résultat avec très peu de travail supplémentaire. Idéal si vous stockez les pages à des fins de référence et que vous souhaitez adapter les résultats dans une application personnelle de type "intranet". Comme eXist est centré sur les documents, il dispose de nombreuses méthodes pour la recherche de texte flou, la recherche de mots proches et possède un excellent index de texte intégral (bien meilleur que celui de MySQL). Parfait si vous êtes après avoir fait une extraction de données sur le contenu, par exemple: trouver tous les documents où un mot comme "burger" dans les 50 mots de "hotdog" où le mot n'est pas dans une liste UL. Essayez de faire que natif dans MySQL! En outre, et sans intention de malveillance,

Je me demande souvent pourquoi eXist est négligé lorsque les gens créent des CMS. C'est une base de données qui peut stocker le contenu dans son format natif (XML, ou son sous-ensemble (x) HTML), interroger avec facilité dans son format natif, et peut le traduire de son format natif avec un langage de template puissant qui ressemble et agit comme son format natif. Parfois, SQL est tout simplement faux pour le travail!

Désolé. Je ne voulais pas dire gaufre! : -