Sqlalchemy использует имя схемы вместо имени db в команде USE - PullRequest
2 голосов
/ 17 октября 2019

Я пытаюсь использовать 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',)]

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Кажется, это ошибка в SQLAlchemy. Я открыл проблему на GitHub , и в следующей версии (1.4) будет исправление, которое будет исправлено.

0 голосов
/ 17 октября 2019

Кажется, вам нужно использовать имя и передать двоеточие.

pymssql
engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...