it-swarm.com.de

Stellen Sie mit Flask-SQLAlchemy eine Verbindung zur MSSQL-Datenbank her

Ich versuche, über Flask-SQLAlchemy eine Verbindung zu einer lokalen MSSQL-Datenbank herzustellen.

Hier ist ein Code-Auszug aus meiner __init__.py-Datei:

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

Wie Sie in SQL Server Management Studio sehen können, scheinen diese Informationen übereinzustimmen:

 enter image description here

Hier ist die Erstellung einer einfachen Tabelle in meiner models.py-Datei:

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)

Ich verbinde mich dann über eine Python-Konsole in Pycharm über die Ausführung dieser beiden Zeilen mit der Datenbank:

>>> from LendApp import db
>>> db.create_all()

Dies führt zu dem folgenden Fehler:

DBAPIError: (pyodbc.Error) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

Das einzige, was mir einfällt, ist, dass meine Datenbankverbindungszeichenfolge falsch ist. Ich habe versucht, es in eine Standard-Pyodbc-Verbindungszeichenfolge umzuwandeln und driver={SQL SERVER} zu verwenden, aber nicht vorherrschen.

Wenn mir jemand dabei helfen könnte, wäre ich sehr dankbar.

Vielen Dank

7
Harrison

Ich hatte also gerade ein sehr ähnliches Problem und konnte es folgendermaßen lösen. 

Nach der Dokumentation der SQL Alchemy konnte ich feststellen, dass ich die pyodbc-Verbindungszeichenfolge folgendermaßen verwenden könnte:

# 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

Dies führte dann zu einem zusätzlichen Fehler, da ich auch Flask-Migrate verwendet habe und anscheinend% im Verbindungs-URI nicht mag. Also habe ich noch ein wenig gegraben und diese post gefunden. Ich änderte dann die folgende Zeile in meiner ./migrations/env.py-Datei 

Von: 

from flask import current_app
config.set_main_option('sqlalchemy.url',
                   current_app.config.get('SQLALCHEMY_DATABASE_URI'))

Zu:

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)

Nachdem ich all dies getan hatte, konnte ich meine Migrationen durchführen und alles scheint, als ob es jetzt richtig funktioniert. 

7
Matt Camp

Ich glaube, Ihrer Verbindungszeichenfolge fehlen die Authentifizierungsdetails. In der Flask-SQLAlchemy-Dokumentation sollte die Verbindungszeichenfolge das folgende Format haben

dialect+driver://username:[email protected]:port/database

Nach Ihrem Beispiel glaube ich, dass es so aussehen wird

app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pyodbc://<username>:<password>@<Host>:<Port>/LendApp'
1
GerardoMR

Ich habe gerade meine Verbindungszeichenfolge in etwa so geändert und es hat perfekt funktioniert

HINWEIS: Sie müssen pyodbc installieren, um zu funktionieren ....

app.config["SQLALCHEMY_DATABASE_URI"] = "mssql+pyodbc://user:[email protected]/database?driver=SQL+Server"
0
Praveen

Wenn jemand noch auf dieses Problem gestoßen ist und versucht hat, eine andere Lösung zu finden, versuchen Sie es mit pymssql anstelle von pyodbc;

pip install pymssql

Verbindungs-URI wäre:

conn_uri = "mssql+pymssql://<username>:<password>@<servername>/<dbname>"

0
AKJ