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

26

我正在尝试通过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},但没有成功。

如果有人能够帮助我解决这个问题,我将不胜感激。

谢谢


大家好,关于“未指定默认驱动程序”的问题,我在自己的提问中找到了答案,这可能与以下链接有关:https://stackoverflow.com/a/51927158/1896134 - JayRizzo
8个回答

24

我刚刚遇到了一个非常类似的问题,并通过以下步骤解决了它。

按照SQL Alchemy文档,我发现可以像这样使用我的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中的%。于是我进行了更深入的挖掘,并找到了这篇文章。接着我在./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)

完成所有操作后,我能够进行迁移,并且现在一切似乎都正常工作。


5

如果有人仍在遇到此问题并试图找出另一种解决方案,请尝试使用pymssql代替pyodbc

pip install pymssql

连接URI将是:

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


5

我刚刚更改了连接字符串,类似这样的方式,它完美地工作了。

备注:你需要安装pyodbc才能使用....

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

注意:尽量避免在密码中使用'@'字符。由于连接字符串中的密码后面也有'@'字符,因此您将会遇到错误。这也可能导致连接错误。


谢谢,我漏掉了 ?driver=SQL+Server - Ben-Coden

2
使用以下解决方案,我成功解决了与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/以了解如何解决此问题。

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)

1
我相信你的连接字符串缺少身份验证详细信息。根据Flask-SQLAlchemy文档,连接字符串应该具有以下格式。
dialect+driver://username:password@host:port/database

根据您的示例,我相信它会看起来像这样

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

1
这个解决方案可以创建一个完美的连接字符串,使用flask-sqlalchemy python建立数据库连接时,可以处理包含特殊字符的密码。
# Make sure to replace below data with your DB values
DATABASE_HOST = "10.10.10.110"
DATABASE_NAME = "dbtest"
DATABASE_USERNAME = "admin" 
DATABASE_PASSWORD = "admin@123"

# to elimate the error, if the password contains special characters like '@'
DATABASE_PASSWORD_UPDATED = urllib.parse.quote_plus(DATABASE_PASSWORD)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pymssql://'+DATABASE_USERNAME+':'+DATABASE_PASSWORD_UPDATED+'@'+DATABASE_HOST+'/'+DATABASE_NAME

这段代码片段是使用 Flask-SQLAlchemy Python 为创建数据库连接的一个经过验证的示例。提供数据库。

import os, sys, click, urllib
from flask import Flask, jsonify, request
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text

# Make sure to replace below data with your DB values
DATABASE_HOST = "10.10.10.110"
DATABASE_NAME = "dbtest"
DATABASE_USERNAME = "admin" 
DATABASE_PASSWORD = "admin@123"

app = Flask(__name__)

# to elimate the error, if the password contains special characters like '@' 
DATABASE_PASSWORD_UPDATED = urllib.parse.quote_plus(DATABASE_PASSWORD)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mssql+pymssql://'+DATABASE_USERNAME+':'+DATABASE_PASSWORD_UPDATED+'@'+DATABASE_HOST+'/'+DATABASE_NAME
app.config['SQLALCHEMY_ECHO'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# check if the connection is successfully established or not
with app.app_context():
    try:
        # db.session.execute('SELECT 1')
        db.session.execute(text('SELECT 1'))
        print('\n\n----------- Connection successful !')
    except Exception as e:
        print('\n\n----------- Connection failed ! ERROR : ', e)


class Test(db.Model):
    __tablename__ = 't_test'
    __table_args__ = {'extend_existing': True} # allows you to modify the existing table without raising an error.
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    applicationnumber = db.Column(db.String(15))
    source = db.Column(db.String(50))

    def __init__(self, applicationnumber, source):
        self.applicationnumber = applicationnumber
        self.source = source
        print("Executed __init__ !")


@app.route('/api/test', methods=['POST'])
def insert():
    try:
        applicationnumber = request.json['applicationnumber']
        source = request.json['source']
        
        try:
            t_test_obj = Test(applicationnumber, source)
            db.session.add(t_test_obj)
            db.session.commit()
            print("\nRow commited --------")
            return jsonify({'status': 'success', 'message': 'Values inserted successfully.'}), 201
        except Exception as e :
            error=f"Exception Raised : {e}, errorOnLine: {sys.exc_info()[-1].tb_lineno}, file : {os.path.basename(__file__)}"
            click.secho(error, fg="red")
            return jsonify({'status': 'failure', 'message': f"{error}"}), 500

    except Exception as e:
        db.session.rollback()
        return jsonify({'status': 'error', 'message': str(e)}), 500


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)


# MSSQL query to create table t_test 
'''
CREATE TABLE t_test(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [applicationnumber] [varchar](50) NOT NULL,
    [source] [varchar](50) NULL
)
'''

# API JSON request
'''
{"applicationnumber": "IM012345",
"source": "ABCD"
}
'''


0

我也遇到了这个问题,这是我的解决方案:

    import pyodbc

    conn_str = 'DRIVER={ODBC Driver 17 for SQL Server};' \
                   'SERVER=ServerName;' \
                   'DATABASE=dbName;' \
                   'UID=uid;' \
                   'PWD=pass'
    
        conn = pyodbc.connect(conn_str)

app.config["SQLALCHEMY_DATABASE_URI"] = 'mssql+pyodbc:///?odbc_connect={}'.format(conn_str)

我必须安装并配置ODBC驱动程序。 下载SQL Server的ODBC驱动程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接