9
votes

Tables qualifiées de schéma avec Sqlalchemy, SQLite et PostgreSQL?

J'ai un projet de pylônes et un modèle SQLalchemy qui implémente les tables qualifiées de schéma: xxx

Ce code fonctionne bien avec PostgreSQL mais échoue lorsque vous utilisez SQLite sur la table et les noms de clés étrangers (en raison de la SQLite's Manque de support de schéma)

SQLALCHEMY.EXC.OPERATIONRORRORROR: (OperateurError) Base de données inconnue "Hiver" 'Pragma "Hiver" .table_info ("Hockey")' ()

I ' D Aimez continuer à utiliser SQLite pour Dev et tests.

Y a-t-il une façon de faire échouer gracieusement sur SQLite?


6 commentaires

Quelles difficultés que vous avez avec Postgres sur votre développement et vos machines de test?


Je ferais votre configuration plus simple. Utiliser des postgres de bout en bout. Ne testez pas sur SQLite et publiez sur Postgres.


Coller avec SQLite facilite le flux de travail, en particulier pour les AQ des AQ, car ils ne doivent pas être conscients de leurs tests DB. Juste aller avec postgres partout est un plan solide "B"


Avez-vous essayé d'utiliser moteur.execute ("Joindre la base de données '{db}' comme hiver;". Format (db = _sl_file)) pour pirater ce problème? BTW, je suis d'accord avec le commentaire Starship3000 concernant PostgreSQL.


@Stephan Comment le ferait-il avec un DB SQLite in-Memory?


@Chris: pour joindre un dB nouvellement créé in-Memory DB à une dB existante (en mémoire ou fichier), vous venez d'exécuter moteur.execute ("Joindre la base de données ': mémoire:" comme db_name; ") . Je ne connais pas un moyen d'attacher un déjà existant in-Memory DB (attacher une base de données de fichier existante sur une mémoire en mémoire n'est pas un problème). Donc, vous devez fondamentalement changer l'ordre de création: joignez la DB en mémoire d'abord (qui en crée une nouvelle), puis crée des tables pour cette nouvelle DB en mémoire et remplissez avec des données si nécessaire.


3 Réponses :


10
votes

J'aimerais continuer à utiliser SQLite pour Dev et test.

Y a-t-il un moyen d'avoir cette échec Gracieusement sur SQLite?

Il est difficile de savoir où commencer avec ce type de question. Donc . . .

Arrêtez-le. Juste arrêter ça.

Il existe certains développeurs qui n'ont pas le luxe de développer sur leur plate-forme cible. Leur vie est un code de déménagement difficile (et parfois des compilateurs) d'un environnement à l'autre, débogage à deux reprises (qui devait parfois déboguer à distance sur la plate-forme cible), venant progressivement à une prise de conscience que le rongeant dans leur intestin est en fait la début d'un ulcère.

Installez PostgreSQL.

Lorsque vous peut utiliser utiliser le même environnement de base de données pour le développement, les tests et le déploiement, vous Devrait .

Sans parler de l'équipe QA. Pourquoi tester-t-il des choses sur Terre qu'ils ne vont pas expédier? Si vous déployez sur PostgreSQL, assurez-vous que la qualité de vos travaux sur PostgreSQL.

Sérieusement.


2 commentaires

Ma modification est tombée sur une nouvelle réponse. Cette réponse a mon texte intégral. L'autre manque mon préoccupation remarquable pour toutes les personnes fines de QA.


Si un serveur que tout le monde peut accéder au développement et à des tests est disponible, PostgreSQL pourrait être installé sur place au lieu de localement sur toutes les machines. Cela faciliterait facilement le fardeau des testeurs car ils n'auraient pas besoin de l'installer.



4
votes

Je suis juste un débutant moi-même, et je n'ai pas utilisé de pylônes, mais ...

Je remarque que vous combinez la table et la classe associée ensemble. Que diriez-vous si vous les séparez si vous les séparez? P> xxx pré>

alors vous pouvez créer un p>

mapper(Hockey, hockey_table)


1 commentaires

Qu'en est-il de ces personnes qui ont une politique de coopération d'utilisation de MSSQL (produit Windows) pendant que le développement de l'application se produit sur le côté Linux? Bien que ce soit vraiment cool d'utiliser PostgreSQL étant donné la quantité de données figurant sur les données actuelles, la migration est loin à l'avenir.



1
votes

Je ne sais pas si cela fonctionne avec des clés étrangères, mais quelqu'un pourrait essayer d'utiliser Sqlalchemy's Traduction de schéma multi-location pour les objets de table . Cela a fonctionné pour moi mais j'ai utilisé personnalisé primairejoin code> et expressions secondaires en combinaison avec des touches principales composites.

La carte de traduction du schéma peut être transmise directement au Créateur du moteur: P>

...

if dialect == "sqlite":
    url = lambda: "sqlite:///:memory:"
    execution_options={"schema_translate_map": {"winter": None, "summer": None}}
else:
    url = lambda: f"postgresql://{user}:{pass}@{host}:{port}/{name}"
    execution_options=None

engine = create_engine(url(), execution_options=execution_options)

...


0 commentaires