J'essaie de me connecter à une base de données MSSQL locale via Flask-SQLAlchemy.
Voici un extrait de code de mon fichier __init__.py
:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pyodbc://HARRISONS-THINK/LendApp'
db = SQLAlchemy(app)
SQLALCHEMY_TRACK_MODIFICATIONS = False
Comme vous pouvez le constater dans SQL Server Management Studio, ces informations semblent correspondre:
Voici la création d'un tableau simple dans mon fichier models.py
:
from LendApp import db
class Transaction(db.model):
transactionID = db.Column(db.Integer, primary_key=True)
amount = db.Column(db.Integer)
sender = db.Column(db.String(80))
receiver = db.Column(db.String(80))
def __repr__(self):
return 'Transaction ID: {}'.format(self.transactionID)
Je me connecte ensuite à la base de données à l'aide d'une console Python dans Pycharm via l'exécution de ces deux lignes:
>>> from LendApp import db
>>> db.create_all()
Cela entraîne l'erreur suivante:
DBAPIError: (pyodbc.Error) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
La seule chose à laquelle je peux penser est que ma chaîne de connexion à la base de données est incorrecte. J'ai essayé de le modifier pour qu'il corresponde davantage à une chaîne de connexion Pyodbc standard et notamment à driver={SQL SERVER}
, mais aucune règle ne prévale.
Si quelqu'un pouvait m'aider avec ça, ce serait très apprécié.
Merci
J'ai donc eu un problème très similaire et j'ai pu résoudre le problème en procédant comme suit.
Suite à la Documentation SQL Alchemy J'ai découvert que je pouvais utiliser la chaîne de connexion pyodbc comme ceci:
# Python 2.x
import urllib
params = urllib.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password")
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
# Python 3.x
import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password")
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
# using the above logic I just did the following
params = urllib.parse.quote_plus('DRIVER={SQL Server};SERVER=HARRISONS-THINK;DATABASE=LendApp;Trusted_Connection=yes;')
app.config['SQLALCHEMY_DATABASE_URI'] = "mssql+pyodbc:///?odbc_connect=%s" % params
Cela a ensuite provoqué une erreur supplémentaire car j'utilisais également Flask-Migrate et apparemment, il n'aime pas% dans l'URI de la connexion. J'ai donc creusé un peu plus et trouvé ce post . J'ai ensuite changé la ligne suivante dans mon fichier ./migrations/env.py
De:
from flask import current_app
config.set_main_option('sqlalchemy.url',
current_app.config.get('SQLALCHEMY_DATABASE_URI'))
À:
from flask import current_app
db_url_escaped = current_app.config.get('SQLALCHEMY_DATABASE_URI').replace('%', '%%')
config.set_main_option('sqlalchemy.url', db_url_escaped)
Après avoir fait tout cela, j'ai pu effectuer mes migrations et tout me semble comme si tout fonctionnait correctement.
Je crois que votre chaîne de connexion manque les détails d'authentification. Dans la documentation Flask-SQLAlchemy, la chaîne de connexion doit avoir le format suivant.
dialect+driver://username:password@Host:port/database
D'après votre exemple, je pense que cela ressemblera à quelque chose comme ça
app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pyodbc://<username>:<password>@<Host>:<Port>/LendApp'
Si quelqu'un tombe encore sur cette question et tente de trouver une autre solution, essayez avec pymssql
au lieu de pyodbc
;
pip install pymssql
L'URI de connexion serait:
conn_uri = "mssql+pymssql://<username>:<password>@<servername>/<dbname>"