如何获取SQLAlchemy以使用配置文件将MSSQL连接到AWS?

时间:2018-08-20 08:49:20

标签: sql-server python-3.x flask flask-sqlalchemy flask-migrate

版本

  

Mac OSX 10.13.6(17G65)

     

AWS RDS MSSQL实例Select @@VERSION; Microsoft SQL Server 2017

     

python3 -V Python 3.7.0

     

pip3 show Flask-SQLAlchemy名称:Flask-SQLAlchemy V:2.3.2

     

pip3 show Flask-Migrate名称:Flask-Migrate V:2.2.1

config.py

class Config(object):
    """Docstring for Config Class."""

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
    SQLALCHEMY_DATABASE_URI = (os.environ.get('DATABASE_URL'))

.env

SECRET_KEY=SuperDuperSecretPassKey
DATABASE_URL='mssql+pyodbc://DRIVER={ODBC Driver 17 for SQL Server};SERVER=My-custom-route.a0aaa0000aaaa.us-east-1.rds.amazonaws.com;DATABASE=Databasetoconnectto;UID=JayRizzo;PWD=SuperAwesomePassword!!!'

问题:

如何在配置中正确设置SQLAlchemy URL?

  1. 编码或解码的URL?
  2. 我可以使用URL字符串吗?
  3. 必须是DSN吗?

注意:

我可以使用模板和python文件直接连接,例如Connect to MSSQL Database using Flask-SQLAlchemyeven using pyodbc that I created.

但是当我使用env变量时,出现了以下错误:

  1. 值必须是字符串配置
  2. 无法从字符串'%s'“%name解析rfc1738 URL
  3. sqlalchemy.exc.DBAPIError:(pyodbc.Error)('IM012','[IM012] [unixODBC] [Driver Manager] DRIVER关键字语法错误(0)(SQLDriverConnect)')(此错误的背景位于:{ {3}})
  4. sqlalchemy.exc.InterfaceError:(pyodbc.InterfaceError)('IM002','[IM002] [unixODBC] [Driver Manager]数据源名称未找到且未指定默认驱动程序(0)(SQLDriverConnect)')(背景有关此错误,请访问:http://sqlalche.me/e/dbapi

我很困惑...

1 个答案:

答案 0 :(得分:2)

  • 我可以使用URL字符串吗?
    • 不是我能做到这么远。
  • 编码或解码的URL?
  • 必须是DSN吗?
    • 是的,到目前为止这是可行的。

使用DSN

好吧,我能够使用DSN进行连接,这是一种有趣的研究方法...

  1. 检查您的odbcinst驱动程序和配置
$ odbcinst -j 

unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /Users/jkirchoff/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

然后查看,自定义,验证odbcinst.ini和odbc.ini文件。

/usr/local/etc/odbcinst.ini

[My_installed_ODBC_driver]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/usr/local/lib/libmsodbcsql.17.dylib
Driver=/usr/local/Cellar/msodbcsql17/17.2.0.1/lib/libmsodbcsql.17.dylib
UsageCount=1
  

重要提示:请确保您检查驱动程序的路径是否存在!

  

注意:是的,我知道驱动程序有两个位置,第一个是符号链接,另一个是实际位置。它仍然适用于列出的一个或两个。只是出于好奇。

/usr/local/etc/odbc.ini

[MY_Custom_DSN_NAME]
Driver              = My_installed_ODBC_driver
Description         = My Connection to AWS
Database            = MyDatabaseNameHERE
Server              = My-custom-route.a0aaa0000aaaa.us-east-1.rds.amazonaws.com
Readonly            = No
Port                = 1433
Trace               = No

请确保与驱动程序的命名约定匹配My_installed_ODBC_driver是我的示例。

然后将您的.env文件设置为包含与上面列出的DSN_name的连接,将是

[烧瓶项目的根目录] /。env

DATABASE_URL='mssql+pyodbc://JayRizzo:SpaceInvaderPassword!@MY_Custom_DSN_NAME'
  

注意:考虑到链接,它应该如下所示:odbcinst.ini将驱动程序提供给> odbc.ini将DSN名称提供给> .env [MY_Custom_DSN_NAME]

  

相反的Env文件引用odbc,并且它为驱动程序引用odbcinst。您想怎么想。

最后

My_installed_ODBC_driver和MY_Custom_DSN_NAME可以是您想要的任何名称。只需确保它们正确匹配即可(这是我的问题的一部分,最初是尝试使用DSN。)

我无法使用直接连接网址。

到目前为止,我只能使用DSN进行连接。

现在我可以使用SQLAlchemy flask db upgradeflask db migrate

任何见识都会很好。

希望您能够遵循我的逻辑。

链接

even if you double encode the URL