Я знаю, что можно указать схему в 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
.
Есть лиЕсть ли способ добиться этого или мне придется каждый раз создавать новый движок?