SQLAlchemy:更改引擎使用的架构

时间:2019-03-22 10:41:54

标签: 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;")])
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异常。

有什么方法可以实现这一目标,还是每次都必须创建一个新引擎?

0 个答案:

没有答案