Exécution de requêtes SQL à partir d'un fichier dans SQLAlchemy
Comment puis-je exécuter l'ensemble des fichiers sql dans la base de données à l'aide de SQLAlchemy? Il existe beaucoup de différentes requêtes sql dans le fichier, y compris begin et commit/rollback.
Vous devez vous connecter pour publier un commentaire.
Malheureusement, je ne suis pas au courant d'une bonne réponse à cette question. Certains dbapi de l' (psycopg2 par exemple) pour l'exécution de plusieurs instructions à la fois. Si les fichiers ne sont pas énormes, vous pouvez simplement charger dans une chaîne de caractères et de les exécuter sur une connexion. Pour les autres, je voudrais essayer d'utiliser un client de ligne de commande pour que db et le tuyau de données en utilisant le sous-processus module.
Si ces approches ne sont pas acceptables, alors vous aurez à aller de l'avant et de mettre en œuvre un petit analyseur SQL qui peut diviser le fichier à l'écart, dans des déclarations séparées. C'est vraiment difficile à obtenir 100% de réponses correctes, que vous aurez à facteur dans la base de données dialecte spécifique littérale échapper à des règles, le jeu de caractères utilisé, toute base de données options de configuration qui affectent littéral de l'analyse (par exemple, PostgreSQL standard_conforming_strings).
Si vous avez seulement besoin d'obtenir cette 99.9% de réponses correctes, puis quelques regexp magie devrait vous obtenez la plupart du chemin.
J'ai été en mesure d'exécuter .schéma sql fichiers à l'aide de pure SQLAlchemy et certaines manipulations de chaînes. Il n'est sûrement pas une approche élégante, mais il fonctionne.
Il parcourt toutes les lignes dans une .fichier sql en ignorant les lignes commentées.
Puis il enchaîne des lignes qui forment une déclaration complète et tente d'exécuter l'instruction. Vous avez juste besoin d'un gestionnaire de fichier et un objet de session.
Si vous utilisez sqlite3 il a une extension utile pour dbapi appelé conn.executescript(str), j'ai accroché ce par quelque chose comme cela et ça semblait fonctionner: (Pas tout le contexte est montré, mais il devrait être suffisant pour obtenir la dérive)
Est-ce mal pur, je me demande? J'ai cherché en vain une "pure" sqlalchemy équivalent, cela pourrait peut-être être ajouté à la bibliothèque, quelque chose comme db_session.execute_script(file_name) ? J'espère que db_session fonctionnent très bien, après tout ça (c'est à dire, pas besoin de redémarrer le moteur), mais pas sûr encore... plus de recherche est nécessaire (c'est à dire que nous avons besoin d'un nouveau moteur ou tout simplement une session après avoir derrière sqlalchemy est de retour?)
FYI sqlite3 comprend une relative routine: sqlite3.complete_statement(sql) si vous roulez votre propre parser...
Vous pouvez le faire avec SQLalchemy et psycopg2.
Vous pouvez accéder à la crue DBAPI connexion par le biais de ce
mais ensuite cela dépend du dialecte/pilote que vous utilisez, ce qui peut être considéré par le biais de ce liste.
Pour pyscog2, il vous suffit de faire
mais pysqlite vous aurez besoin de faire
et en ligne avec qui vous auriez besoin de vérifier la documentation de celui DBAPI pilote que vous utilisez pour voir si plusieurs états sont autorisés dans un exécuter ou si vous avez besoin d'utiliser une aide comme
executescript
qui est unique à pysqlite.