我之前在这里看到过这个问题,但我想得到一个最终的是/否。
我一直在尝试使用 Netbeans 6.8(根本没有运气)和新发布的 Netbeans 6.9(注意到代码已被调用但未能阻止代码执行)调试我的应用程序。
是否可以调试 CherryPy 应用程序?
我的应用程序使用与此类似的技术连接到多个数据库.只要我不尝试在同一请求中访问不同的数据库,它就可以工作.回顾上面的脚本,我看到他们为此写了一个评论:
SQLAlchemy integration for CherryPy,
such that you can access multiple databases,
but only one of these databases per request or thread.
Run Code Online (Sandbox Code Playgroud)
我的应用程序现在要求我从数据库A和数据库B中获取数据.是否可以在单个请求中执行此操作?
请参阅下面的资料和示例:
工作示例1:
from model import meta
my_object_instance = meta.main_session().query(MyObject).filter(
MyObject.id == 1
).one()
Run Code Online (Sandbox Code Playgroud)
工作示例2:
from model import meta
my_user = meta.user_session().query(User).filter(
User.id == 1
).one()
Run Code Online (Sandbox Code Playgroud)
错误示例:
from model import meta
my_object_instance = meta.main_session().query(MyObject).filter(
MyObject.id == 1
).one()
my_user = meta.user_session().query(User).filter(
User.id == 1
).one()
Run Code Online (Sandbox Code Playgroud)
这个错误:
(sqlalchemy.exc.ProgrammingError) (1146, "Table 'main_db.user' doesn't exist")
Run Code Online (Sandbox Code Playgroud)
资料来源:
# meta.py
import …Run Code Online (Sandbox Code Playgroud) 我正在使用sqlalchemy的反射工具来获取Table对象.我这样做是因为这些表是动态的,表/列可以更改.这是我正在使用的代码:
def getTableByReflection(self, tableName, metadata, engine):
return Table(tableName, metadata, autoload = True, autoload_with = engine)
Run Code Online (Sandbox Code Playgroud)
问题是,当上面的代码运行两次时,无论列是否已更改,它似乎都会返回相同的结果.我尝试刷新使用mysession.refresh(mytable)但失败,因为表没有附加到任何元数据 - 这是有道理但但为什么我看到缓存结果?
有没有办法告诉元数据/引擎/会话忘记这个表,让我干净地加载它?
我的代码目前在 SQLAlchemy ORM 层中执行查询就好了,如下所示:
session().query(model_a).join(
(model_b, something == somethingelse)
).join(
(model_c, something == somethingelse)
) # etc ...
Run Code Online (Sandbox Code Playgroud)
但是我遇到了一个需要几分钟才能完成的查询。结果证明 MySQL 是罪魁祸首,因为它没有按照我们要求的顺序加入。添加STRAIGHT_JOIN后SELECT喜欢:
SELECT STRAIGHT_JOIN table_a.id FROM table_a INNER JOIN table_b ...
Run Code Online (Sandbox Code Playgroud)
解决了这个问题,但我不知道是否有办法让 SQLAlchemySTRAIGHT_JOIN在SELECT. 文档建议可以向select()via添加提示,with_hint(table_a, "STRAIGHT_JOIN")但这会将文本添加到错误的位置,从而导致 MySQL 语法错误。这也将涉及跳出并不理想的 ORM。
我已经尝试过使用各种 MySQL 调试技术,例如EXPLAIN,ANALYZE TABLE等等……但似乎无法找出 MySQL 选择错误路径的原因。手动切换连接的顺序似乎也没有帮助,所以我现在处于需要让 STRAIGHT_JOIN 工作的位置。
有任何想法吗?