我正在嘗試使用 SQLAlchemy 通過網絡連接到 SQL Server 數據庫。我在使用 pyodbc 作為驅動程序時遇到了一些麻煩,因此切換到 pymssql 并最終設法使用我的用戶名“salas\guilherme.santo”創建引擎并連接到“fit_alunos”數據庫中的服務器:from sqlalchemy import create_engine, inspecteng = create_engine('mssql+pymssql://salas\guilherme.santo:pass@server/fit_alunos?charset=utf8')然后如果我檢查引擎,一切似乎都很好:insp = inspect(engine)insp.default_schema_name # 'SALAS\\Guilherme.Santo'insp.get_schema_names() # a list of schemas with the pattern SALAS\\'something'insp.get_table_names() # all the tables in my schema, with no problem但是如果我嘗試創建一個MetaData對象并反映引擎:from sqlachemy import MetaDatameta = MetaData()meta.reflect(bind=eng)我得到了這個OperationalError:OperationalError: (pymssql.OperationalError) (911, b"Database 'SALAS\\Guilherme' does not exist. Make sure that the name is entered correctly.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n")[SQL: use [SALAS\Guilherme]](Background on this error at: http://sqlalche.me/e/e3q8)我猜 SQLAlchemy 正在解釋數據庫是“SALAS\Guilherme”而架構是“Santo”,而不是數據庫“fit_alunos”和架構“SALAS\Guilherme.Santo”。有沒有辦法配置數據庫和模式,以便它可以正確加載?[編輯]我用一個引擎運行了反射方法echo=True,發現它使用 SQL 函數獲取數據庫名稱:2019-10-17 16:27:16,330 INFO sqlalchemy.engine.base.Engine select db_name()2019-10-17 16:27:16,330 INFO sqlalchemy.engine.base.Engine {}2019-10-17 16:27:16,350 INFO sqlalchemy.engine.base.Engine use [SALAS\Guilherme]2019-10-17 16:27:16,350 INFO sqlalchemy.engine.base.Engine {}2019-10-17 16:27:16,389 INFO sqlalchemy.engine.base.Engine ROLLBACK---------------------------------------------------------------------------MSSQLDatabaseException Traceback (most recent call last)似乎SELECT db_name()返回的是模式名稱而不是數據庫名稱。然后,我測試了獲取數據庫名稱和模式名稱的 SQL 函數的返回值,似乎是對的with eng.connect() as con: rs = con.execute("select schema_name();") print(rs.fetchall()) # [('SALAS\\Guilherme.Santo',)] rs = con.execute("select db_name();") print(rs.fetchall()) # [('fit_alunos',)]
2 回答

大話西游666
TA貢獻1817條經驗 獲得超14個贊
看來您需要使用名稱并使用冒號傳遞。
pymssql engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')
添加回答
舉報
0/150
提交
取消