【问题标题】:How to print or log real executed query statements, such as django insert, query and other SQL statements will be logged如何打印或记录真实执行的查询语句,如django insert、query等SQL语句会被记录
【发布时间】:2020-03-14 19:12:15
【问题描述】:

如何打印或记录真正执行的查询语句,例如django insert、query等SQL语句会被记录。我搜索了这两个库的文档,没有发现任何相关内容。

我想要类似于 django 的东西,因为我可以执行任何查询,例如 User.object.filter(name='123').values("id", "phone") 并记录此查询的实际执行语句:select id, phone from auth_user where name='123'

【问题讨论】:

  • 更具体。
  • 如果您只插入收听Change 事件并且您碰巧有一个集群,我认为MongoDB ChangeStream 可以帮助您。其他离线,你可以查看Mtools
  • pymongo 有一个处理程序来监控查询:api.mongodb.com/python/current/api/pymongo/monitoring.html
  • @Peter 正如我所尝试的,监视器确实会监听事件,但它不会执行查询
  • 您使用 MongoDB 还是关系数据库?我问这个问题是因为问题标签包括mongodb,但是您想获得类似sql的查询,但是MongoDB没有类似sql的语言支持

标签: python mongodb pymongo mongoengine


【解决方案1】:

我相信你有两个选择:

1) 使用 pymongo.monitoring,这个来自 MongoEngine 文档的 link 显示了如何配置它。

2) 使用db.setProfilingLevel(2) 打开Profiling,然后所有查询都将添加到db.system.profile collection。 例如:执行此db.users.findOne({'name': 'abc'}),会将以下内容添加到db.system.profile 集合中:

{
    "op" : "query",
    "ns" : "myDb.users",
    "command" : {
        "find" : "users",
        "filter" : {
            "name" : "abc"
        },
        "limit" : 1,
        ....
        "$db" : "myDb"
    },
    "keysExamined" : 0,
    "docsExamined" : 0,
    "cursorExhausted" : true,
    "numYield" : 0,
    "locks" : {...},
    "nreturned" : 0,
    "responseLength" : 83,
    "protocol" : "op_msg",
    "millis" : 0,
    "planSummary" : "EOF",
    ...
    "ts" : ISODate("2019-11-20T19:27:13.297Z"),
    "appName" : "MongoDB Shell",
    "allUsers" : [ ],
    "user" : ""
}

如您所见,不幸的是,它不如 SQL 查询实用,但信息就在那里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-28
    • 2012-08-09
    • 2013-08-18
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多