Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consider adding a new plugin hook: "pre_query" or similar #2338

Open
jamietanna opened this issue Apr 28, 2024 · 3 comments
Open

Consider adding a new plugin hook: "pre_query" or similar #2338

jamietanna opened this issue Apr 28, 2024 · 3 comments

Comments

@jamietanna
Copy link

As noted on my Fediverse-enabled blog, I was looking to build a Datasette plugin that allows for finding what commonly performed queries occur with the database, to attempt to learn what's regularly looked up:

Does anyone know if there's a good way of getting a historical storage of queries that users put into Datasette? Trying to get some stats around common queries and usage, couldn't see a plugin for it, but not sure if my searching just missed it

It appears that the plugin hooks right now don't make this available. Would this be something you're interested in adding? Or is it maybe something that could be achieved a better way?

I believe I could also look at using https://docs.datasette.io/en/stable/internals.html#request-object to pull out the querystring?

@jamietanna
Copy link
Author

jamietanna commented Apr 28, 2024

And of course, I look again, and see that https://datasette.io/plugins/datasette-query-history may be exactly what I want

It looks like this plugin does it for the current session, whereas I'd be looking for across any user interacting with the database

@simonw
Copy link
Owner

simonw commented Apr 29, 2024

Yeah, the way to do this right now would be with a asgi_wrapper middleware that logs requests. I played with that a few years ago here: https://simonwillison.net/2019/Dec/16/logging-sqlite-asgi-middleware/

I've been thinking for a while that it might be good to have some kind of middleware at a slightly different level from that - a Datasette equivalent of the Django concept of "view" middleware, which acts after a view function has been selected by URL routing: https://docs.djangoproject.com/en/5.0/topics/http/middleware/#process-view

I don't think I'll do that before 1.0 though, as I need to be very confident that Datasette's own view internals are stable before encouraging people to customize them like that.

@asg017
Copy link
Collaborator

asg017 commented Apr 30, 2024

Maybe you can use the set_trace_callback() option on the SQLite connection? You can use the startup hook the access the db connection, then that callback will be ran for every SQL query.

Though it seems pretty limited. The SQLite C API has extensive tracing/profiling support, which gives you things like "how long did this statement take", but it doesn't look like the Python library supports it

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants