Я пытаюсь использовать SQLAlchemy для подключения к базе данных SQL Server по сети. У меня были некоторые проблемы с использованием pyodbc в качестве драйвера, поэтому я переключился на pymssql и, наконец, мне удалось создать движок и подключиться к серверу в базе данных 'fit_alunos', используя мое имя пользователя 'salas \ guilherme.santo':
from sqlalchemy import create_engine, inspect
eng = 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 MetaData
meta = 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',)]