web-dev-qa-db-ja.com

Flask-SQLAlchemyを使用してMSSQLデータベースに接続する

Flask-SQLAlchemyを介してローカルMSSQL DBに接続しようとしています。

これは私の__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

SQL Server Management Studioで確認できるように、この情報は一致しているようです。

enter image description here

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)

次に、Python Pycharm内のコンソールを使用して、次の2行を実行してデータベースに接続しています。

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

これにより、次のエラーが発生します。

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

私が考えることができる唯一のことは、私のデータベース接続文字列が間違っているということです。標準のPyodbc接続文字列に変更してdriver={SQL SERVER}を含めてみましたが、勝ちません。

誰かがこれで私を助けることができれば、それは高く評価されるでしょう。

ありがとう

10
Harrison

だから私は非常に似たような問題を抱えていて、次のことを行うことで解決することができました。

SQL Alchemy documentation に続いて、次のようにpyodbc接続文字列を使用できることがわかりました。

# 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

Flask-Migrateも使用しており、接続URIの%が気に入らないため、これにより追加のエラーが発生しました。それで、私はもう少し掘り下げて、これを見つけました post./migrations/env.pyファイルの次の行を変更しました

から:

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)

これをすべて行った後、移行を行うことができ、すべてが正常に動作しているように見えます。

12
Matt Camp

接続文字列に認証の詳細が欠けていると思います。 Flask-SQLAlchemyドキュメントから、接続文字列は次の形式である必要があります

dialect+driver://username:password@Host:port/database

あなたの例から、私はそれがこのようなものになると信じています

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

誰かがまだこの問題につまずいて別の解決策を見つけようとしている場合は、pymssqlではなくpyodbcを試してください。

pip install pymssql

接続URIは次のとおりです。

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

1
AKJ

接続文字列を次のように変更しただけで、完全に機能しました

注:動作させるにはpyodbcをインストールする必要があります。

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