[HN Gopher] Tuql: Automatically create a GraphQL server from a S...
       ___________________________________________________________________
        
       Tuql: Automatically create a GraphQL server from a SQLite database
        
       Author : thunderbong
       Score  : 107 points
       Date   : 2023-04-25 11:35 UTC (1 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | minhazm wrote:
       | If your use case is read-only I suggest taking a look at
       | roapi[1]. It supports multiple read frontends (GraphQL, SQL,
       | REST) and many backends like SQLite, JSON, google sheets, MySQL,
       | etc.
       | 
       | [1] https://github.com/roapi/roapi
        
         | ewuhic wrote:
         | Is there anything similar that I could deploy to vercel? My
         | usecase is API produced from JSON source, and I dont want a
         | server for it, only static assets.
        
           | chatmasta wrote:
           | You might like what we're building with Seafowl [0], which is
           | an open-source, single binary database you can deploy to the
           | edge for executing cache-friendly queries (so e.g. you can
           | deploy to fly.io free tier, load your data into it, and put
           | Cloudflare in front of it to cache query results like any
           | other HTTP response).
           | 
           | Here's an example [1] multi-page site with Next.js and
           | Seafowl.
           | 
           | [0] https://seafowl.io/docs/getting-started/introduction
           | 
           | [1] https://github.com/splitgraph/madatdata/tree/main/example
           | s/r...
        
           | MuffinFlavored wrote:
           | Devil's advocate: why can't you deploy Dockerfile of roapi to
           | Vercel (or fly.io)?
           | 
           | What is the defacto "hobbyist tinker-er" standard for "I want
           | to deploy this Docker thing into the cloud and play with it
           | on the Internet"? There's got to be some one-click deploy
           | solution where it goes to a Github repo, picks up a Helm
           | chart, deploys it to a k8s cluster or something?
        
             | stepbeek wrote:
             | You can deploy a docker container to heroku, digitalocean
             | app platform etc. no helm config required.
        
           | simonw wrote:
           | Datasette was designed for Vercel from the start. It's a
           | really great way of turning data into a read-only API, with
           | both JSON and GraphQL endpoints.
           | 
           | https://datasette.io/
           | 
           | Demo here:
           | https://datasette.simonwillison.net/simonwillisonblog
           | 
           | GraphQL demo here: https://datasette.simonwillison.net/graphq
           | l?query=%7B%0A%20%...
           | 
           | To deploy a SQLite database to Vercel with a GraphQL API:
           | brew install datasette         datasette install datasette-
           | publish-vercel         datasette publish vercel mydatabase.db
           | \           --project my-new-vercel-project-name \
           | --install datasette-graphql
           | 
           | Here's a tutorial on how to get data into that SQLite
           | database in the first place:
           | https://datasette.io/tutorials/clean-data
        
       | cratermoon wrote:
       | I knew GraphQL would eventually come down to this, it was already
       | apparent in the idea. Instead of replacement for REST services,
       | GraphQL is really more like a way to expose a database schema
       | from any relational database in a standard way. Regardless of
       | whether the database is SQLite, Postgres, or a proprietary
       | product like Oracle or DB2, slap a generate GraphQL front end on
       | it now it's available remotely without needing a client driver.
        
         | eurasiantiger wrote:
         | Slap them into entity-normalized subgraphs and now you can
         | compose all your databases, indexes, queues, etc. into one
         | supergraph where you can seamlessly resolve entity fields
         | across all your data stores.
        
       | Chinni95 wrote:
       | Good one
        
       | simonw wrote:
       | Impressive how little code is involved here! This is really neat.
       | 
       | The biggest feature I can see that's missing is pagination - it
       | looks like this doesn't have a way to retrieve e.g. ten results,
       | then pass a next token to get back the next set.
       | 
       | Here's how I implemented pagination in my similar datasette-
       | graphql plugin (which also gives you a GraphQL API for an
       | existing SQLite database): https://github.com/simonw/datasette-
       | graphql#pagination
        
       | ElectricalUnion wrote:
       | > The primary key column is named id or thing_id or thingId,
       | where thing is the singular form of the table name.
       | 
       | Is it naming relations a plural word a common thing in practice?
       | 
       | I thought best-practice was to name relations either singular (as
       | each tuple represents one entry) or uninflected (still singular
       | for most words), specially when you're not a fluent speaker of
       | the language being used to name the relations of the database.
       | 
       | Plurals are often irregular for commonly used words, and the fact
       | that this requires a external dependency (
       | https://github.com/plurals/pluralize ) to cover for some "common
       | plurals" is telling that supporting this feature is a complex
       | thing indeed - that would not be required in the first place with
       | singular everywhere.
        
       | runlaszlorun wrote:
       | I took a quick peek at the code and, unless I missed looking at
       | big file somewhere, looks like it's only around 550 lines of
       | code.
       | 
       | That's great if so. I haven't looked at lines of code in any
       | other graphql library but I'd guess there'd be far more.
        
         | VWWHFSfQ wrote:
         | pretty sure this is wrapping other libraries. sequelize and
         | graphql
        
           | runlaszlorun wrote:
           | Aha, yes, you're right. I see those in the package.json.
        
       | davidmccabe wrote:
       | GraphQL is really intended to model UI concepts rather than
       | directly exposing your database schema.
       | 
       | First of all, your GraphQL schema is basically append-only due to
       | older clients that may remain in the wild. So you don't want to
       | expose implementation details that may change.
       | 
       | Second, you want to write client code that handles mutations.
       | This is easier if the data the client receives is organized in a
       | UI-centric way. I'll give you a simple example that came up at
       | work recently: a single conceptual category (a "user account")
       | that, due to implementation details, was spread across two
       | different tables with different columns. Because the GraphQL
       | schema in this case mapped each table to its own GraphQL type,
       | somebody was then able to write client code that only handled one
       | type and not the other, causing an inconsistent UI.
       | 
       | I would suggest thinking carefully about your GraphQL schema,
       | treating it as an API, and not auto-generating it. Of course, you
       | want it to be convenient to construct, just not fully automatic
       | and thoughtless.
        
         | TheNewsIsHere wrote:
         | I've been kicking around a project idea for years that would be
         | a niche fit for these considerations. It's effectively an
         | extremely niche reference corpus of very field-specific data,
         | effectively represented by JSON documents and having a few
         | relationships that don't require transactions. It wouldn't be
         | editable by clients at all. Every client would be nothing more
         | than a consumer, and the database would be versioned and only
         | edited by the maintainer.
         | 
         | That is certainly not a common use of web based APIs, to have
         | an application that is read only every client, but the reason I
         | came to this thread was because I've considered SQLite for this
         | idea in the past.
        
         | no_wizard wrote:
         | This is what I constantly tell people. Use GraphQL to
         | efficiently create permutations of access so the data is shaped
         | for the client more or less exactly how they need it. To that
         | end, I often recommend that at least one UI developer is
         | involved in approving schema changes and regularly dogfoods the
         | GQL setup before its deployed.
         | 
         | I have been met with a lot of resistance around this notion for
         | some reason.
         | 
         | To be honest, I fought the same argument with OpenAPI (Swagger)
         | too.
         | 
         | API developers seemingly just want to chuck their schema over
         | the wall and walk away
        
       | codethief wrote:
       | Very cool, though I'm not sure how production-ready this is,
       | given that there doesn't seem to be a way to add authorization
       | for certain fields / queries.
       | 
       | Also, does the generated schema include the primary keys?
       | Otherwise caching in the frontend might turn out to be difficult.
        
         | runlaszlorun wrote:
         | Which graphql frameworks do handle auth? It's a genuine
         | question, I don't know the space but had to rule out graphql in
         | its early days for a seeming lack in this area. But I've got a
         | project now where it might be a great fit.
        
           | amichal wrote:
           | Hasura has authz this (but ive only used it it toy
           | situations) authn is jwt or custom integration https://hasura
           | .io/docs/latest/auth/authorization/permissions...
           | 
           | Edit: roles via jwt token
           | https://hasura.io/docs/latest/auth/authentication/jwt/
        
           | codethief wrote:
           | Authorization is usually not handled by a GraphQL framework.
           | You typically have a business layer between your GraphQL API
           | and your database. (And probably some basic JWT
           | _authentication_ layer in front of your API. Notice the
           | difference between authorization  & authentication.)
        
             | runlaszlorun wrote:
             | Sorry, yes, I meant authorization. So you're saying to just
             | effectively run a filter in the business layer based on
             | allowed role/user/whatever. Seems pretty straightforward
             | but I wonder if I'm missing something.
        
               | codethief wrote:
               | > run a filter in the business layer based on allowed
               | role/user/whatever
               | 
               | Yup, this is the way I've seen it implemented everywhere
               | so far.
        
           | jensneuse wrote:
           | You could use WunderGraph in front of your GraphQL and REST
           | APIs to add auth, e.g. using OpenID Connect:
           | https://docs.wundergraph.com/docs/auth/cookie-based-
           | auth/ope...
        
         | bradleyboy wrote:
         | Hey - I'm the author of tuql (if you can still call it
         | authorship, I haven't updated this library in a long time :) )
         | 
         | I originally wrote this to speed up prototyping / development
         | projects, I'd never recommend shipping this anywhere near
         | production.
        
       ___________________________________________________________________
       (page generated 2023-04-26 23:01 UTC)