2017-08-10 3 views
1

Je dois lire une base de données SQL-SERVER existante avec Django FWK et après avoir connecté avec succès à la base de données, lorsque je me réfère à MyModel.objects. tous() Django lancer une requête avec le nom de la table citée, mais il échoue parce que SQL Server doit le schéma de préfixe, obtenir l'erreur:comment modéliser une table en tant que sql-server needs [nom_schéma]. [Nom_table]

('42S02', "[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid object name 'table_name'. (208) (SQLExecDirectW)") 

EDIT: Cela ne se produit avec un non « défaut » paramètres de base de données django. Mystérieusement, ma base de données par défaut n'a pas besoin d'un traitement spécial, et est une base de données sql-server avec un utilisateur db sans schéma par défaut.

Comment puis-je configurer le modèle ou les paramètres.DATABASE ou le dbrouter pour que django se connecte au schéma spécifique et n'a pas besoin d'utiliser le nom_schéma?

Option 1: modèle Meta propriété de classe: db_table = 'schema_name.table_name' ne fonctionne pas, parce que la requête qui a construit la clause FROM comme [schema_name.table_name] et ce qui doit sql est [schema_name] . [nom_table]

Option 2: settings.DATABASE 'NOM' se réfère déjà à la schema_name, mais il ne suffit pas

Option 3: aucune idée comment dire django pour se connecter au schéma spécifique ou pour ajouter le nom de schéma de préfixe à tous les requêtes qu'il construit.

Option 4: faites en sorte que django n'entoure pas db_table avec des crochets. Lorsque je définis db_table comme 'schema.table', la requête résultante l'entoure de [schema.table]. Sans les crochets "[]", la requête fonctionnerait.

+0

Si vous avez besoin d'un seul schéma pour préfixer vos objets, vous pouvez définir comme schéma par défaut de votre utilisateur. Je veux dire, si vous référencez le thable comme MyTable sans aucun schéma, cela ne provoque pas d'erreur, SQL Server le recherche d'abord dans votre schéma utilisateur par défaut, puis il essaie dbo, et seulement échoue si l'objet n'a pas été trouvé par défaut schéma ou dans dbo – sepupic

+0

Question connexe: [définir le schéma par défaut pour une requête sql] (https://stackoverflow.com/q/4942023/2144390) –

+0

Je n'ai aucun privilège pour modifier le schéma par défaut des utilisateurs, mais si vous pensez être le seulement, peut-être que je pourrais en faire la demande aux échelons supérieurs ... – toscanelli

Répondre

1

Django ne prend pas en charge plusieurs schémas; il utilise le schéma par défaut de l'utilisateur connect.

Cependant, cela a fonctionné pour moi dans un pincement à la fois avec PostgreSQL et SQL Server:

db_table = 'your_schema\".\"your_table'

Si ou lorsque Django offre le soutien de plusieurs schèmes (plusieurs années de discussion ici: https://code.djangoproject.com/ticket/6148), cela cassure probable. Dans mon projet, ça me va, mais c'est quelque chose qui devrait être évalué projet par projet, car il n'est pas officiellement supporté.

Il y avait un PR de l'année dernière qui a commencé à travailler sur ce ainsi: https://github.com/django/django/pull/6162

Bonne chance!