web-dev-qa-db-fra.com

Se connecter à la base de données MSSQL à l'aide de Flask-SQLAlchemy

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:

 enter image description here

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

7
Harrison

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. 

7
Matt Camp

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'
1
GerardoMR

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>"

0
AKJ