使用Flask-SQLAlchemy连接到MSSQL数据库

时间:2017-10-13 23:32:35

标签: python sql-server flask-sqlalchemy

我尝试通过Flask-SQLAlchemy连接到本地MSSQL数据库。

这是我的__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)

然后我通过执行这两行,使用Pycharm中的Python控制台连接到数据库:

>>> 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},但不会占上风。

如果有人能帮我解决这个问题,我们将非常感激。

由于

6 个答案:

答案 0 :(得分:9)

所以我遇到了一个非常类似的问题,并且能够通过执行以下操作来解决问题。

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)

完成所有这些后,我能够进行迁移,现在看起来好像一切正​​常。

答案 1 :(得分:2)

我遇到了同样的问题,可以通过指定以下内容解决此问题:

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mssql+pyodbc://MySQLServerName/MyTestDb?driver=SQL+Server?trusted_connection=yes"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)

答案 2 :(得分:1)

我相信您的连接字符串缺少身份验证详细信息。从Flask-SQLAlchemy文档中,连接字符串应具有以下格式

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

从您的示例中,我相信它看起来像这样

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

答案 3 :(得分:1)

如果仍然有人偶然发现此问题并试图找到其他解决方案,请尝试使用pymssql而不是pyodbc

pip install pymssql

连接URI为:

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

答案 4 :(得分:0)

我只是像这样更改了连接字符串,并且效果很好

注意:您需要安装pyodbc才能工作。...

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

答案 5 :(得分:0)

使用以下解决方案,我可以解决与MSSQL服务器的连接问题

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

如果由于用户错误而导致登录失败,请转到此 http://itproguru.com/expert/2014/09/how-to-fix-login-failed-for-user-microsoft-sql-server-error-18456-step-by-step-add-sql-administrator-to-sql-management-studio/