Python SQLAlchemy:更改引擎使用的架构

Python SQLAlchemy:更改引擎使用的架构,python,mysql,sql,sqlalchemy,flask-sqlalchemy,Python,Mysql,Sql,Sqlalchemy,Flask Sqlalchemy,我知道可以在创建引擎时使用的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;

我知道可以在创建引擎时使用的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;")])
在这里,我们创建一个没有连接到任何特定模式的引擎。我们发出
使用
命令。但是,这似乎无法正常工作:

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)
2019-03-22 11:24:56175信息sqlalchemy.engine.base.engine使用MySchema
2019-03-22 11:24:56175信息sqlalchemy.engine.base.engine()
2019-03-22 11:24:56176信息sqlalchemy.engine.base.engine显示表;
2019-03-22 11:24:56176信息sqlalchemy.engine.base.engine()
[(‘表1’,),(‘表2’,),(‘表3’,)]
2019-03-22 11:24:56177信息sqlalchemy.engine.base.engine显示表;
2019-03-22 11:24:56177信息sqlalchemy.engine.base.engine()
2019-03-22 11:24:56177信息sqlalchemy.engine.base.engine回滚
回溯(最近一次呼叫最后一次):
文件“test_sqlalchemy.py”,第20行,在
打印([t代表b.execute中的t(“显示表格;”))
...
defaulterrorhandler中的文件“/home/user/.py2env/local/lib/python2.7/site packages/MySQLdb/connections.py”,第36行
提高errorclass,errorvalue
sqlalchemy.exc.OperationalError:(_mysql_exceptions.OperationalError)(1046,“未选择数据库”)
[SQL:显示表;]
(有关此错误的背景信息,请访问:http://sqlalche.me/e/e3q8)
只有第一个连接已实际连接到数据库,所有其他连接都将失败,并出现
未选择任何数据库的异常


是否有任何方法可以实现这一点,否则每次我都必须创建一个新引擎?

当您执行
engine.execute('USE MySchema')
时,会连接到数据库,执行语句,并将连接返回到连接池。然后
a=engine.connect()
从池中获取相同的连接,但接下来的两个连接调用是新的连接,它们对第一个连接上执行的USE语句一无所知,因此它们还必须调用USE语句。我认为通常的方法是使用两个不同的引擎连接到每个模式。