[HN Gopher] Show HN: ESQLate - Build minimum viable admin panels... ___________________________________________________________________ Show HN: ESQLate - Build minimum viable admin panels with just SQL Author : mattatkeyboard Score : 439 points Date : 2020-01-17 08:56 UTC (14 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | jimmcslim wrote: | There is also the idea of Naked Objects [1] based on a thesis | from 2004 [2]. | | [1] http://nakedobjects.org/ | | [2] | http://downloads.nakedobjects.net/resources/Pawson%20thesis.... | esamatti wrote: | This looks great! I've used sqlpad[1] for similar purposes which | is bit more low level as it allows to write the queries in the | browser directly. | | [1]: https://github.com/rickbergfalk/sqlpad | mattbee wrote: | It looks excellent! But I know https://redash.io already and used | it in my last business - does this do something different? I'm | always hungry for better SQL business admin tools though. | tyingq wrote: | A quick scan of the docs seems to indicate redash is read only. | sandGorgon wrote: | could you check the code ? i think esqlate-server is .gitignored | mattatkeyboard wrote: | esqlate-server lives at | https://github.com/forbesmyester/esqlate-server | | It might be the instructions for install a bit off but I've | tested on MacOS and Ubuntu (both BASH)... Which method is your | install? If it's Docker Compose ( | https://github.com/forbesmyester/esqlate#docker-compose-meth... | ) it has a BASH line there in the README that does the checkout | for you. | | [ ! -d "esqlate-server" ] && git clone | git@github.com:forbesmyester/esqlate-server.git esqlate-server | matthewaveryusa wrote: | You may want to revisit how you do this. At the very least | use git submodules so a particular version of your code pulls | the correct version of a dependency. | cube2222 wrote: | Great work! I once was a fan of custom well tailored DSL's for | each tool. However, nowadays I really like the current direction | of providing a lot of tooling with only SQL necessary to use | them, even with the dialects differing a bit. | | I've made my own contribution here too, with a tool to join and | analyse data in various databases and file formats (JSON, CSV, | Excel) using plain SQL, OctoSQL: | https://github.com/cube2222/octosql | emmelaich wrote: | > ... I really like the current direction of providing a lot of | tooling with only SQL necessary to use them, ... | | Everything old is new again! Database Backed | Web Sites: The Thinking Person's Guide to Web Publishing | Philip Greenspun - 1997 | | http://dannyreviews.com/h/Database_Web.html | mstade wrote: | This is really cool stuff, thanks for sharing! | | I'm working on a desktop application which has feature to let | users query data across a bunch of different data sources, like | csv, excel, and some others. The way I've implemented this is | by first scanning all applicable files and populating a SQLite | database with all the data from these files, a table per file | essentially, and then allowing users to execute queries against | the database. The database is updated whenever any of these | files are changed on disk, but any writes to the database are | not persisted back into the files on disk, so it's really a | one-way kind of flow. This was all implemented mostly as a | proof-of-concept, but it's been massively useful so we're | probably going to expand on it this year, perhaps by allowing | bi-directional workflows. | | Even if the use cases and approach is different, it's nice and | validating to see other projects with similar thoughts and | ideas. Again, thanks for sharing! | cube2222 wrote: | Glad you like it! | | I think I've seen an open source project with the approach | described by you too. | | However, I think philosophically we differ in that one of our | goals is to push down as much work as possible to the | underlying databases and our next big upcoming milestone is | streaming (Kafka, possibly database change streams). | | But yes, it's great that a kind of ecosystem is forming | around those ideas! | mstade wrote: | Absolutely agree regarding difference in approach - and I'm | by no means suggesting that yours is in any way worse! In | fact, I believe yours is much, much better given the more | general use cases it supports. Ours is inherently stateful | and requires careful coordination, which works for us | because the system is pretty much self contained and it | makes things easier, but I don't think it's a good generic | solution to be honest. | | My point was really that it's nice and validating to see | the the whole idea of a unified way to "query all the | things!" as it were isn't all that novel. :o) | | By the way, if you can think of the name (or a URL even!) | of that project you mention I'd be very interesting to take | a look at that too. Much obliged! | cube2222 wrote: | I didn't want to come of as suggesting you meant any of | that, not at all! Just comparing approaches. | | I think it was this: https://github.com/simonw/datasette | though supports only CSV files. | | There's also Apache Drill which works with a lot of data | sources, which is philosophically closer to OctoSQL. | mstade wrote: | Haha, I'm sorry - I didn't mean to sound accusatory or | anything like that. Text based communication can be | tricky! :o) I very much appreciate the comparison! | | Also, many thanks for the link and Apache Drill mention, | will definitely look into these as well. Much obliged! | yehia2amer wrote: | This look similar to Oracle Apex: https://apex.oracle.com/en/ | | from my experience very good for simple logic but once it's is | complicated you hate yourself. | darau1 wrote: | Guys on my team struggle with Apex daily since we've started | using it, which has lead to me look for a better, FOSS | alternative. This looks like it might be the one | bsaul wrote: | i was stunned the first time i saw web frameworks like django and | symfony automatically build a full featured admin panel based on | model's definition. | | I wonder if there aren't projects aimed a building just an | administration GUI based on SQL introspection mixed with simple | configuration files. Just point at a db, and there you go. | | Side note : what is the current state of codegen based on api and | model specifications ? I feel like 90% of most projects could be | automatically generated just based on that. | brainzap wrote: | There are a lot of headless CMS which assists with the | creation. | mickael-kerjean wrote: | > building just an administration GUI based on SQL | introspection | | I built exactly this. The idea was to make databases look and | feel like a file manager where databases are shown as folder, | tables as subfolders and rows are shown as files that once open | shows a fully editable form that look like this: | https://archive.kerjean.me/public/2020/screenshot_20200117_2... | It understands foreign keys and create relevant links to easily | navigate through. The entire code is there: | https://github.com/mickael-kerjean/filestash | zozbot234 wrote: | > I built exactly this. The idea was to make databases look | and feel like a file manager where databases are shown as | folder, tables as subfolders and rows are shown as files that | once open shows a fully editable form ... It understands | foreign keys and create relevant links to easily navigate | through. | | I thought that was the whole point of e.g. LibreOffice Base | and the like? (including Paradox, Access, etc.) So you built | a web-based clone? | mickael-kerjean wrote: | > So you built a web-based clone? | | It's more of an elaborate answer to the infamous ftp | comment from when Dropbox did launch in 2007 here on HN | (https://news.ycombinator.com/item?id=8863). At its root, | the project tries to solve the Dropbox problem by | abstracting the storage aspect so that you can bring your | own backend by implementing a simple interface. | | The mysql plugin is just an implementation of that model to | enable non nerds to crud a database without braking | anything. I did a few one of those implementations: FTP, | SFTP, S3, ... Mysql is just one of those "for the sake of | science" one to be put in the same bag as the LDAP one: | https://www.filestash.app/ldap-browser.html | bsaul wrote: | very nice ! | | As an advice from a marketing POV : i wouldn't start by | explaining that it lets you navigate ftp servers using file | abstraction. This is very confusing, because most people | already access ftp servers using tools like filezilla clients | that do exactly that. | | The db -> file browser is a very interesting idea that i | think should stand on its own (even if the underlying tech is | similar). | cdrx wrote: | I think forestadmin.com / jetadmin.io are the SQL introspection | equivalent of the Django Admin. Both are commercial products | though. | vidarh wrote: | For my current project, we're auto-generating a relatively | full-featured CRUD interface with granular access controls and | the works. [one detail to add there is that while it's | primarily used as an admin interface now, it's not meant to be | restricted to that - it has access control and workflow support | built in that we're building product flows on, where the UI is | still generated the same way] | | It's not _just_ from the SQL, but we use Sequel (Ruby ORM) to | introspect the DB as a starting point, coupled with a plugin to | Sequel that lets us annotate the models to provide more precise | information that our Sinatra based API introspects to return | JSON data to our React frontend that drives how the UI is | presented. This extends to e.g. declaring which fields are most | useful for users to search for relations that should be linked | via foreign keys, for example (e.g. users are linked to by id, | but when linking a user from another record, they are | searchable by name and e-mail). As much as practical we auto- | generation validations etc. from the database schema as well. | | I think doing this by SQL alone would be quite painful unless | you sacrifice usability, because a typical database schema has | too little information on how _users_ think about the data. | | E.g. we dialled back on using Postgres enum types because | they're annoying to update and deal with if you frequently | update the allowed values - but you need relatively little | extra config to be able to generate very full-featured | interfaces, and you can make most of that extra information | entirely declarative. Foreign keys is another issue, as | described above - a normal database schema just tells you how | things are linked together, not how users would like to see it. | E.g. knowing a comment was written by user 42 is much less | useful than knowing it was written by bob@example.com; to allow | user-friendly linking etc. you'll want more information. We | refer to our additional layer of information about the | structure of our data as our meta schema. | | You certainly _could_ put the parts that don 't fit perfectly | in your database schema in your database anyway as regular | data, and to some extent we do - e.g. the meta information that | we augment our Sequel model classes with can be overridden by | rows in a table. | | But the main reason we've not fully embraced that vs. | annotating the model classes in code is that it makes version | control painful, and if you update it with migrations it's | really not saving that much vs. just putting it in the model | classes (this might be different if you have other applications | accessing the database and the database in effect needs to be a | versioned API in itself accessible by multiple consumers, but | in this case all the database access happens via the API | exported from the model classes). | Cthulhu_ wrote: | There's plenty of database administration tools that do just | that. I guess they could use work in the UX department to make | it more user friendly though. | | But beyond pure data access you'll want features like access | rights (SQL servers will offer that to a point), validations, | and data/context specific visualizations. | fulldecent2 wrote: | Metabase? | zubairq wrote: | Yes yazz Pilot lets you build an admin panel by pointing at a | dB and then it queries the database tables which you select | visually | barrystaes wrote: | I think this is the long way around to simply making a DB | procedure? Those have parameters, can easily be run by external | tools like phpMyAdmin or an IDE, and if the database constraints | are sane will help avoid invalid input. | mattatkeyboard wrote: | That is true, and I considered this approach. But DB procedures | cannot link to each other and the target users are different - | giving some people a DB procedure is much harder than giving | them a web interface. | howmayiannoyyou wrote: | Good, but, I don't want to write UI configs in JSON. Making the | UI should be as minimally difficult as the rest of the app makes | tasks. | [deleted] | tomerbd wrote: | Brilliant. Interesting to see you used svelte! Anyone else has | experience with it? | nautilus12 wrote: | I wonder if there is anything like this but for a larger swath of | tools, like say anything that is JDBC or ODBC compliant. More | like data virtualization tools like dremio, denodo, atscale. | mattatkeyboard wrote: | The amount of code in this that talks to the DB is really | really tiny. It is certainly possible to support multiple | databases. | jimmar wrote: | Interesting idea. Are you doing anything to protect against sql | injection attacks? | mattatkeyboard wrote: | Yeh. It send through the key/values in HTTP POST and then you | have the SQL and K/C's on the server, the SQL itself is not | sent. Server passes them through as parameters to the Node.JS | `pg` module so that takes care of defeating SQL injection. | xwowsersx wrote: | Another worthy mention (not FE, but also exploiting power of | sql): https://github.com/PostgREST/postgrest | | "PostgREST serves a fully RESTful API from any existing | PostgreSQL database. It provides a cleaner, more standards- | compliant, faster API than you are likely to write from scratch." | geewee wrote: | PostgREST is really hard to figure out how to use though. I | tried it a year or two ago because I was really excited about | the posibillity, but the setup was super unintuitive, and the | docs were hard to follow. I got a simple case working, but in | the end I gave up on using it for anything serious - I simply | wouldn't trust myself to be able to debug it if something went | wrong. | marviel wrote: | You might find Postgraphile interesting, if you like graphql: | https://github.com/graphile/postgraphile | hadem wrote: | You might also find Hasura interesting for instant GraphQL | with Postgres: https://hasura.io/ | marviel wrote: | Thanks! Have you tried both systems? I've never heard of | hasura, so don't know the extent to which they compare. | At a glance it looks like they serve largely the same | problem. | vosper wrote: | I have tried both, but only a bit and for a personal | project. In the end I went with Hasura because I like the | admin interface, and I think the way it maps graphQL to | SQL makes for easier-to-read (and write) graphQL queries. | | I actually tried PostgREST first, because I had never | used GraphQL and was more familiar with RESTful APIs. But | I would go straight to Hasura if I was starting today. | | When you combine graphql was graphql-codegen you can get | typechecked queries, which is really nice. | aidos wrote: | We're using Hasura. Not affiliated but we do pay for | their support (great team to work with). | | Hasura have taken a few unusual steps that actually turn | out to be good choices. They have their own version of | row level security that you configure via the admin | console. It plays very nicely with their subscription | queries so there's very little load on the dB (they | effectively poll the dB and build a temp table of the | config Params of each connected client so they can pull | back the data for every subscription in a single query). | It works really well in practice. | | We kicked the tyres on most the products in the space | (and even had our own implementation using socket io). | There were a couple of things about Hasura that didn't | seem to make sense but after a quick call with them we | decided that between their answers, and the team | themselves, it was the product we liked and trusted the | most. | | Highly recommended. | gavinray wrote: | The Hasura team are incredible. Not only that they're | great people and responsive, but they have one of the | most absurdly talented devteams I've ever seen | (especially in regards to their Haskell devs). | [deleted] | pagnol wrote: | Mind explaining in more detail the difficulties you | encountered? | janci wrote: | Why not have the admin panels configuration stored in a database | itself instead of json? And use the admin panels to add more | admin panels... | saviorand wrote: | This is awesome! Saves so much work on building simple admin | panels. I have experience in custom software development, and | that's such a huge pile of work for developers it's insane | xupybd wrote: | Thank you so much I've wanted something like this for years but | never invested the time into finding or building it. | rygxqpbsngav wrote: | Used to do something similar with Microsoft Light switch. | Rowern wrote: | This looks pretty interesting! If anyone is looking for a tool to | build a full fledge Back Office I warmly recommend react-admin | (https://github.com/marmelab/react-admin/). Been using it for a | year now and we went from 0 back office to a feature full one in | no time! | brentis wrote: | Been researching space as well. This is more feature complete | IMO. | | https://react-material-dashboard.devias.io/dashboard | esistgut wrote: | The is just a web "template". React-admin is a full featured | framework with multiple data backends. | airstrike wrote: | Or, you know, just use Django ;-) | ianmobbs wrote: | This is a great option for stacks not built on Django! | cpursley wrote: | React Admin is awesome. Combine it with Hasura (automatic | GraphQL on top of PostgreSQL) and you can build an entire back | office admin suite (API endpoints and admin front end) in a | matter of hours. You end up writing more SQL than react as | react-admin is basically a CRUD form generator. | | This adaptor connects react-admin with Hasura: | https://github.com/Steams/ra-data-hasura-graphql | BjoernKW wrote: | That looks quite useful. The name's pretty clever, too. | | Tools like these are a viable, low-code (to use a hyped-up term) | alternative to creating full-blown back-ends with all the | boilerplate code that comes with them. Often these back-ends add | little more than a REST API or a simple CRUD interface on top of | an SQL database. | | RDBMS on the other hand are immensely powerful tools that | unfortunately more often than are used for little more than | simple data storage. | trungdq88 wrote: | Interesting. How would you make this to support one-to-many/many- | to-many relationships? | BjoernKW wrote: | This being a tabular visualisation of SQL result sets you'd | either have duplication in some columns or aggregated results. | | That's simply how SQL deals with 1:n and n:m relations. | mattatkeyboard wrote: | You write the SQL into a JSON file. Users then can then execute | that SQL with their own parameters. So the many-to-many is in | your capability... A key reason for this is that it itself | should not be clever. | 0xff00ffee wrote: | Does anyone else find it humorous that the majority of top-level | comments in this thread start with, "Cool! I built something just | like this <insert link to example> because <commercial solution> | sucks!" | | This tells me that (a) it is a common problem, and (b) it is not | solved well. I'm guilty too: I manage a large MySQL DB and the | admin panels are essentially CRUD UI rendered from the schema. | The alt solutions I've clicked on here try to add more | functionality, but it seems that's where things break, because | every solution is different beyond the 1st-order CRUD UI. This | seems to indicate there is no generic solution beyond that? | Twisell wrote: | Feel free to laugh at me but I often miss MS Access layout | tools. | | MS Access is totally unscalable and due to it's proprietary | licence I can't recommend it to anyone... but it was super | freaking easy to stich together a graphical UI usable by non | expert users. | | I'm a SQL/GIS/Dev based on PostgreSQL/PostGis and I would | totally harass my boss to buy such a solution if it were to | exist. I have no time to learn latest front-end flavor so being | able to quickly deploy any customizable AND simple GUI between | my SQL illiterate colleagues an our database would by | priceless! | | If such solution does exist please have a laugh at me for being | ignorant and I would really appreciate if you could send some | links to that product! | 0xff00ffee wrote: | MS Access... / _shiver_ / | | Let's just laugh at each other and call it even. :) | topspin wrote: | > Feel free to laugh at me but I often miss MS Access layout | tools | | Hell, I miss Paradox. In DOS. There was a direct relationship | between the tables and the UI so you got CRUD as a side | effect. | | I built several real application using it, but the best was a | true "enterprise" application used across three facilities. | The "backend" was a Netware file system and the key to making | it scale was to cache necessary data locally and batch writes | to shared tables. Contention had to be avoided, not because | Paradox couldn't multiplex readers and writers, but because | the performance was so poor. | | It was still spinning when I moved on. Have no idea how long | they maintained it, but I'll bet whatever they replaced it | with cost an order of magnitude more. It was a part of every | dollar of revenue that outfit earned employing ~1000 people. | tyingq wrote: | There are decent top-to-bottom solutions like Quickbase and | Google's Appmaker. I think "generic" is just hard to mix well | into other code. Works better if you control the whole stack. | gavinray wrote: | Super neat idea and tool! | | I tried to clone it and run it locally, but it doesn't run. Tried | with both yarn and npm. > node-sass | src/index.scss > public/index.css sh: 1: node-sass: | not found npm ERR! file sh npm ERR! code | ELIFECYCLE npm ERR! errno ENOENT | eb0la wrote: | I believe admin panels are the MVP implementation for this idea. | | Almost every business software is a select/insert/update. If you | can do it over a view, or you have a trigger on | insert/update/delete you are able to have a customer facing | product with minimal manual operation. | mattatkeyboard wrote: | The REST interface to this is pretty good. It's documented | within esqlate-server | (https://github.com/forbesmyester/esqlate-server) | mattmanser wrote: | So I made something similar to this at a couple of my jobs. We | could basically add a SQL script as a file to a folder and it | would automatically have a new report, downloadable, formatted, | run on-demand. Even a pretty basic one is pretty handy, as they | only take a day or two. I hadn't got round to adding variables, I | like the solution. | | One of the things I added is that you could add column formatting | in the field names, so a $c would turn it into a currency field, | there was one to turn it into boolean checkbox, etc.: | SELECT o.amount, p.price [price$c], p.price * o.amount [total$c] | FROM orders o JOIN products p | | It had other features too like you could set column widths by | using @ like [amount@75] or even column grouping by dot notation | [online.sales], [online.total_value$c], [instore.sales], | [instore.total_value$c]. | mattatkeyboard wrote: | It does basic left/right aligning for strings/numbers etc. | | It's a nice feature/idea but I'm torn between implementing it | and also allowing you to do it in SQL... | | I agree that concat('$', table.amount) as amount should be | right aligned, but mine would leave it left aligned (as it | became a string). | richieartoul wrote: | This is cool. I built something similar awhile back for a side | project. I had a folder that I would dump files into and each | file would have a title, description, and SQL statement. | | When I visited a specific page on my site (password protected) I | had a bit of Go code that would read all the the files, execute | all the (read-only) SQL statements and then dump them into an | HTML template that created a table for each one. | | Made it dead simple to keep track of some simple metrics like | daily sign ups, number of users currently on the site, churn, | etc. | | Hopefully I can just reach for this next time and not write my | own hacky tool :) | yuegui wrote: | If you are looking for some simple SQL to table/report tools, | give Poli a try: https://github.com/shzlw/poli | milankragujevic wrote: | I use adminer for this. https://www.adminer.org/ It's a single | PHP file, and does everything I need. | mantiniss wrote: | Youp, Adminer works great for building a CRUD admin UI. | Gys wrote: | Nice work. I have also build a (mysql) sql based dashboard for | our internal use. It mainly shows agregated lists of data and | allows to click on many items to see more details. | | We use it to get more insight in our data. It does not allow a | user to enter anything. | | Basically my app only uses a list of queries. To allow that any | selected field is clickable, the result field should be like | 'report|name|field,field' so the app knows this is a special link | (report) refering to another defined query ('name') and should be | passed some values (record specific, here 'field,field'). | mattatkeyboard wrote: | Yeh sounds like you had a similar revelation to me :-) This can | also do the linking between "reports" or "forms". Happy you | built one, makes me think this has at least some chance of | success. ___________________________________________________________________ (page generated 2020-01-17 23:00 UTC)