issue_comments
33 rows where author_association = "OWNER", issue = 681375466 and user = 9599 sorted by updated_at descending
This data as json, CSV (advanced)
Suggested facets: created_at (date), updated_at (date)
issue 1
- await datasette.client.get(path) mechanism for executing internal requests · 33 ✖
id | html_url | issue_url | node_id | user | created_at | updated_at ▲ | author_association | body | reactions | issue | performed_via_github_app |
---|---|---|---|---|---|---|---|---|---|---|---|
706305784 | https://github.com/simonw/datasette/issues/943#issuecomment-706305784 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDcwNjMwNTc4NA== | simonw 9599 | 2020-10-09T17:22:55Z | 2020-10-09T17:22:55Z | OWNER | Documentation (from #1006): https://docs.datasette.io/en/latest/internals.html#client |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
705887638 | https://github.com/simonw/datasette/issues/943#issuecomment-705887638 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDcwNTg4NzYzOA== | simonw 9599 | 2020-10-08T23:53:13Z | 2020-10-08T23:53:13Z | OWNER | I want this in Datasette 0.50, so I can use it in |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696778735 | https://github.com/simonw/datasette/issues/943#issuecomment-696778735 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc3ODczNQ== | simonw 9599 | 2020-09-22T15:00:13Z | 2020-09-22T15:00:39Z | OWNER | Am I going to rewrite ALL of my tests to use this instead? It would clean up a lot of test code, at the cost of quite a bit of work. It would make for much neater plugin tests too, and neater testing documentation: https://docs.datasette.io/en/stable/testing_plugins.html |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696777886 | https://github.com/simonw/datasette/issues/943#issuecomment-696777886 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc3Nzg4Ng== | simonw 9599 | 2020-09-22T14:58:54Z | 2020-09-22T14:58:54Z | OWNER | ```python class DatasetteClient: def init(self, ds): self._client = httpx.AsyncClient(app=ds.app())
``` |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696776828 | https://github.com/simonw/datasette/issues/943#issuecomment-696776828 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc3NjgyOA== | simonw 9599 | 2020-09-22T14:57:13Z | 2020-09-22T14:57:13Z | OWNER | I may as well implement all of the HTTP methods supported by the
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696775516 | https://github.com/simonw/datasette/issues/943#issuecomment-696775516 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc3NTUxNg== | simonw 9599 | 2020-09-22T14:55:10Z | 2020-09-22T14:55:10Z | OWNER | Even smaller
``` |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696774711 | https://github.com/simonw/datasette/issues/943#issuecomment-696774711 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc3NDcxMQ== | simonw 9599 | 2020-09-22T14:53:56Z | 2020-09-22T14:53:56Z | OWNER | How important is it to use https://www.python-httpx.org/async/#opening-and-closing-clients says:
The transport I am using is a class called The |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696769853 | https://github.com/simonw/datasette/issues/943#issuecomment-696769853 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc2OTg1Mw== | simonw 9599 | 2020-09-22T14:46:21Z | 2020-09-22T14:46:21Z | OWNER | This adds |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
696769501 | https://github.com/simonw/datasette/issues/943#issuecomment-696769501 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5Njc2OTUwMQ== | simonw 9599 | 2020-09-22T14:45:49Z | 2020-09-22T14:45:49Z | OWNER | I put together a minimal prototype of this and it feels pretty good: ```diff diff --git a/datasette/app.py b/datasette/app.py index 20aae7d..fb3bdad 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -4,6 +4,7 @@ import collections import datetime import glob import hashlib +import httpx import inspect import itertools from itsdangerous import BadSignature @@ -312,6 +313,7 @@ class Datasette: self._register_renderers() self._permission_checks = collections.deque(maxlen=200) self._root_token = secrets.token_hex(32) + self.client = DatasetteClient(self)
@@ -1209,3 +1211,25 @@ def route_pattern_from_filepath(filepath): class NotFoundExplicit(NotFound):
pass
+
+
+class DatasetteClient:
+ def init(self, ds):
+ self.app = ds.app()
+
+ def _fix(self, path):
+ if path.startswith("/"):
+ path = "http://localhost{}".format(path)
+ return path
+
+ async def get(self, path, kwargs):
+ async with httpx.AsyncClient(app=self.app) as client:
+ return await client.get(self._fix(path), kwargs)
+
+ async def post(self, path, kwargs):
+ async with httpx.AsyncClient(app=self.app) as client:
+ return await client.post(self._fix(path), kwargs)
+
+ async def options(self, path, kwargs):
+ async with httpx.AsyncClient(app=self.app) as client:
+ return await client.options(self._fix(path), kwargs)
In [2]: ds = Datasette(["fixtures.db"]) In [3]: (await ds.client.get("/-/config.json")).json() Out[3]: {'default_page_size': 100, 'max_returned_rows': 1000, 'num_sql_threads': 3, 'sql_time_limit_ms': 1000, 'default_facet_size': 30, 'facet_time_limit_ms': 200, 'facet_suggest_time_limit_ms': 50, 'hash_urls': False, 'allow_facet': True, 'allow_download': True, 'suggest_facets': True, 'default_cache_ttl': 5, 'default_cache_ttl_hashed': 31536000, 'cache_size_kb': 0, 'allow_csv_stream': True, 'max_csv_mb': 100, 'truncate_cells_html': 2048, 'force_https_urls': False, 'template_debug': False, 'base_url': '/'} In [4]: (await ds.client.get("/fixtures/facetable.json?_shape=array")).json() Out[4]: [{'pk': 1, 'created': '2019-01-14 08:00:00', 'planet_int': 1, 'on_earth': 1, 'state': 'CA', 'city_id': 1, 'neighborhood': 'Mission', 'tags': '["tag1", "tag2"]', 'complex_array': '[{"foo": "bar"}]', 'distinct_some_null': 'one'}, {'pk': 2, 'created': '2019-01-14 08:00:00', 'planet_int': 1, 'on_earth': 1, 'state': 'CA', 'city_id': 1, 'neighborhood': 'Dogpatch', 'tags': '["tag1", "tag3"]', 'complex_array': '[]', 'distinct_some_null': 'two'}, ``` |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693009048 | https://github.com/simonw/datasette/issues/943#issuecomment-693009048 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwOTA0OA== | simonw 9599 | 2020-09-15T22:17:30Z | 2020-09-22T14:37:00Z | OWNER | Maybe instead of implementing
Maybe I could get this working by returning an object from |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
695133768 | https://github.com/simonw/datasette/issues/943#issuecomment-695133768 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5NTEzMzc2OA== | simonw 9599 | 2020-09-19T00:06:56Z | 2020-09-19T00:07:35Z | OWNER | dogsheep-beta could do with this too. It currently makes a call to
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693010291 | https://github.com/simonw/datasette/issues/943#issuecomment-693010291 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAxMDI5MQ== | simonw 9599 | 2020-09-15T22:20:55Z | 2020-09-15T22:20:55Z | OWNER | Should I instantiate a single https://www.python-httpx.org/advanced/#why-use-a-client says that the main benefit of a Client instance is HTTP connection pooling - which isn't an issue for these internal requests since they won't be using the HTTP protocol at all, they'll be calling the ASGI application directly. So I'm leaning towards instantiating a fresh client for every internal request. I'll run a microbenchmark to check that this doesn't have any unpleasant performance implications. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693008540 | https://github.com/simonw/datasette/issues/943#issuecomment-693008540 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwODU0MA== | simonw 9599 | 2020-09-15T22:16:07Z | 2020-09-15T22:16:07Z | OWNER | I think I can use |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693007512 | https://github.com/simonw/datasette/issues/943#issuecomment-693007512 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwNzUxMg== | simonw 9599 | 2020-09-15T22:13:30Z | 2020-09-15T22:13:30Z | OWNER | I could solve streaming using something like this:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693005033 | https://github.com/simonw/datasette/issues/943#issuecomment-693005033 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwNTAzMw== | simonw 9599 | 2020-09-15T22:06:58Z | 2020-09-15T22:10:58Z | OWNER | What if This would make It would also solve the return type problem: I would return whatever |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693004770 | https://github.com/simonw/datasette/issues/943#issuecomment-693004770 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwNDc3MA== | simonw 9599 | 2020-09-15T22:06:13Z | 2020-09-15T22:06:13Z | OWNER | I'm tempted to create a |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693004572 | https://github.com/simonw/datasette/issues/943#issuecomment-693004572 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwNDU3Mg== | simonw 9599 | 2020-09-15T22:05:39Z | 2020-09-15T22:05:39Z | OWNER | Maybe these methods become the way most Datasette tests are written, replacing the existing |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693004296 | https://github.com/simonw/datasette/issues/943#issuecomment-693004296 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwNDI5Ng== | simonw 9599 | 2020-09-15T22:04:54Z | 2020-09-15T22:04:54Z | OWNER | So what should I do about streaming responses? I could deliberately ignore them - through an exception if you attempt to run I could load the entire response into memory and return it as a wrapped object. I could support some kind of asynchronous iterator mechanism. This would be pretty elegant if I could decide the right syntax for it - it would allow plugins to take advantage of other internal URLs that return streaming content without needing to load that content entirely into memory in order to process it. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
693003652 | https://github.com/simonw/datasette/issues/943#issuecomment-693003652 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY5MzAwMzY1Mg== | simonw 9599 | 2020-09-15T22:03:08Z | 2020-09-15T22:03:08Z | OWNER | I'm not going to mess around with formats - you'll get back the exact response that a web client would receive. Question: what should the response object look like? e.g. if you do:
What should I could reuse the Datasette |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675889865 | https://github.com/simonw/datasette/issues/943#issuecomment-675889865 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTg4OTg2NQ== | simonw 9599 | 2020-08-19T06:57:00Z | 2020-08-19T06:57:00Z | OWNER | Maybe |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675889551 | https://github.com/simonw/datasette/issues/943#issuecomment-675889551 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTg4OTU1MQ== | simonw 9599 | 2020-08-19T06:56:06Z | 2020-08-19T06:56:17Z | OWNER | I'm leaning towards defaulting to JSON as the requested format - you can pass But weird that it's different from the web UI. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675884980 | https://github.com/simonw/datasette/issues/943#issuecomment-675884980 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTg4NDk4MA== | simonw 9599 | 2020-08-19T06:44:26Z | 2020-08-19T06:44:26Z | OWNER | Need to decide what to do about JSON responses. When called from a template it's likely the intent will be to further loop through the JSON data returned. It would be annoying to have to run Maybe a |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675788203 | https://github.com/simonw/datasette/issues/943#issuecomment-675788203 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc4ODIwMw== | simonw 9599 | 2020-08-19T00:46:08Z | 2020-08-19T00:46:23Z | OWNER | Also fun: the inevitable plugin that exposes this to the template language - so Datasette templates can stitch together data from multiple other internal API calls. Fun way to take advantage of |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675787416 | https://github.com/simonw/datasette/issues/943#issuecomment-675787416 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc4NzQxNg== | simonw 9599 | 2020-08-19T00:42:38Z | 2020-08-19T00:42:38Z | OWNER | I just realised that this mechanism is kind of like being able to use microservices - make API calls within your application - except that everything runs in the same process against SQLite databases so calls will be lightning fast. It also means that a plugin can add a new internal API to Datasette that's accessible to other plugins by registering a new route with |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675753114 | https://github.com/simonw/datasette/issues/943#issuecomment-675753114 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc1MzExNA== | simonw 9599 | 2020-08-18T22:34:55Z | 2020-08-18T22:34:55Z | OWNER | Maybe allow this:
This could cause problems if users ever need to pass literal
Not convinced this is useful - it's a bit unintuitive. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675752436 | https://github.com/simonw/datasette/issues/943#issuecomment-675752436 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc1MjQzNg== | simonw 9599 | 2020-08-18T22:32:44Z | 2020-08-18T22:32:44Z | OWNER | One thing to consider here: Datasette's table and database name escaping rules can be a little bit convoluted. If a plugin wants to get back the first five rows of a table, it will need to construct a URL Here's how the It would be an improvement to have this logic abstracted out somewhere and documented so plugins can use it. |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675751719 | https://github.com/simonw/datasette/issues/943#issuecomment-675751719 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc1MTcxOQ== | simonw 9599 | 2020-08-18T22:30:27Z | 2020-08-18T22:30:27Z | OWNER | Right now calling I think a single |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675750845 | https://github.com/simonw/datasette/issues/943#issuecomment-675750845 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc1MDg0NQ== | simonw 9599 | 2020-08-18T22:27:43Z | 2020-08-18T22:27:43Z | OWNER | What about authentication checks etc? Won't they run twice? I think that's OK too, in fact it's desirable: think of the case of |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675750382 | https://github.com/simonw/datasette/issues/943#issuecomment-675750382 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc1MDM4Mg== | simonw 9599 | 2020-08-18T22:26:15Z | 2020-08-18T22:26:15Z | OWNER | Should internal requests executed in this way be handled by plugins that used the Hard to be sure one way or the other. I'm worried about logging middleware triggering twice - but actually anyone doing serious logging of their Datasette instance is probably doing it in a different layer (uvicorn logs or nginx proxy or whatever) so they wouldn't be affected. There aren't any ASGI logging middlewares out there that I've seen. Also: if you run into a situation where your stuff is breaking because So I think it DOES execute |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675749319 | https://github.com/simonw/datasette/issues/943#issuecomment-675749319 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc0OTMxOQ== | simonw 9599 | 2020-08-18T22:23:01Z | 2020-08-18T22:23:01Z | OWNER | Actually no -
(I'll probably add |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675749076 | https://github.com/simonw/datasette/issues/943#issuecomment-675749076 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc0OTA3Ng== | simonw 9599 | 2020-08-18T22:22:21Z | 2020-08-18T22:22:21Z | OWNER | Alternative name possibilities:
|
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675748573 | https://github.com/simonw/datasette/issues/943#issuecomment-675748573 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc0ODU3Mw== | simonw 9599 | 2020-08-18T22:20:52Z | 2020-08-18T22:20:52Z | OWNER | Should it default to treating things as if they had the I think I'm OK with people having to add |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 | |
675747878 | https://github.com/simonw/datasette/issues/943#issuecomment-675747878 | https://api.github.com/repos/simonw/datasette/issues/943 | MDEyOklzc3VlQ29tbWVudDY3NTc0Nzg3OA== | simonw 9599 | 2020-08-18T22:18:46Z | 2020-08-18T22:19:12Z | OWNER | Could be as simple as Bit weird calling it |
{ "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
await datasette.client.get(path) mechanism for executing internal requests 681375466 |
Advanced export
JSON shape: default, array, newline-delimited, object
CREATE TABLE [issue_comments] ( [html_url] TEXT, [issue_url] TEXT, [id] INTEGER PRIMARY KEY, [node_id] TEXT, [user] INTEGER REFERENCES [users]([id]), [created_at] TEXT, [updated_at] TEXT, [author_association] TEXT, [body] TEXT, [reactions] TEXT, [issue] INTEGER REFERENCES [issues]([id]) , [performed_via_github_app] TEXT); CREATE INDEX [idx_issue_comments_issue] ON [issue_comments] ([issue]); CREATE INDEX [idx_issue_comments_user] ON [issue_comments] ([user]);
user 1