SQLAlchemy: изменить схему, используемую движком - PullRequest
1 голос
/ 22 марта 2019

Я знаю, что можно указать схему в URL, используемом при создании движка.В этом случае каждое сгенерированное ядром соединение уже будет использовать указанную базу данных:

engine = create_engine('mysql://%s:%s@%s:%d/%s' % (user, pwd, host, port, schema), echo=True)

a = engine.connect()
b = engine.connect()
c = engine.connect()
print([t for t in a.execute("SHOW TABLES;")])
print([t for t in b.execute("SHOW TABLES;")])
print([t for t in c.execute("SHOW TABLES;")])

Обратите внимание, что команда SHOW TABLES успешно находит таблицы для каждого соединения:

2019-03-22 11:24:10,599 INFO sqlalchemy.engine.base.Engine SHOW TABLES;
2019-03-22 11:24:10,599 INFO sqlalchemy.engine.base.Engine ()
[('Table1',), ('Table2',), ('Table3',)]
2019-03-22 11:24:10,599 INFO sqlalchemy.engine.base.Engine SHOW TABLES;
2019-03-22 11:24:10,599 INFO sqlalchemy.engine.base.Engine ()
[('Table1',), ('Table2',), ('Table3',)]
2019-03-22 11:24:10,600 INFO sqlalchemy.engine.base.Engine SHOW TABLES;
2019-03-22 11:24:10,600 INFO sqlalchemy.engine.base.Engine ()
[('Table1',), ('Table2',), ('Table3',)]

Мой вопрос: возможно ли изменить (или указать позднее) базу данных / схему, используемую движком?

Например, рассмотрим следующую попытку:

engine = create_engine('mysql://%s:%s@%s:%d' % (user, pwd, host, port), echo=True)

engine.execute('USE MySchema')
a = engine.connect()
b = engine.connect()
c = engine.connect()
print([t for t in a.execute("SHOW TABLES;")])
print([t for t in b.execute("SHOW TABLES;")])
print([t for t in c.execute("SHOW TABLES;")])

Здесьмы создаем движок, который не был связан с какой-либо конкретной схемой.Мы выдаем команду USE <schema>.Однако, похоже, что это не работает должным образом:

2019-03-22 11:24:56,175 INFO sqlalchemy.engine.base.Engine USE MySchema
2019-03-22 11:24:56,175 INFO sqlalchemy.engine.base.Engine ()
2019-03-22 11:24:56,176 INFO sqlalchemy.engine.base.Engine SHOW TABLES;
2019-03-22 11:24:56,176 INFO sqlalchemy.engine.base.Engine ()

[('Table1',), ('Table2',), ('Table3',)]
2019-03-22 11:24:56,177 INFO sqlalchemy.engine.base.Engine SHOW TABLES;
2019-03-22 11:24:56,177 INFO sqlalchemy.engine.base.Engine ()
2019-03-22 11:24:56,177 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
  File "test_sqlalchemy.py", line 20, in <module>
    print([t for t in b.execute("SHOW TABLES;")])
  ...
  File "/home/user/.py2env/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1046, 'No database selected')
[SQL: SHOW TABLES;]
(Background on this error at: http://sqlalche.me/e/e3q8)

Только первое соединение было фактически подключено к базе данных, все остальные потерпят неудачу с исключением No database selected.

Есть лиЕсть ли способ добиться этого или мне придется каждый раз создавать новый движок?

...