{"id":37211373,"url":"https://github.com/mustafaakin/gopqgen","last_synced_at":"2026-01-15T00:04:06.865Z","repository":{"id":142889940,"uuid":"80702833","full_name":"mustafaakin/gopqgen","owner":"mustafaakin","description":"Generates the Go structs and getters/setters for PostgreSQL Database","archived":false,"fork":false,"pushed_at":"2017-02-12T20:41:44.000Z","size":47,"stargazers_count":31,"open_issues_count":1,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-08-14T15:46:38.010Z","etag":null,"topics":["go","grpc","microservice","orm","postgresql"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mustafaakin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-02-02T07:26:12.000Z","updated_at":"2022-08-18T19:46:19.000Z","dependencies_parsed_at":"2023-06-18T23:20:44.230Z","dependency_job_id":null,"html_url":"https://github.com/mustafaakin/gopqgen","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mustafaakin/gopqgen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustafaakin%2Fgopqgen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustafaakin%2Fgopqgen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustafaakin%2Fgopqgen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustafaakin%2Fgopqgen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mustafaakin","download_url":"https://codeload.github.com/mustafaakin/gopqgen/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mustafaakin%2Fgopqgen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28439609,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","grpc","microservice","orm","postgresql"],"created_at":"2026-01-15T00:04:06.193Z","updated_at":"2026-01-15T00:04:06.834Z","avatar_url":"https://github.com/mustafaakin.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# gopqgen\n\nThis project aims to generate common CRUD operations for a given PostgreSQL database and expose them as a gRPC API.\n\n## Why?\n\n- Are you tired of writing CRUD?\n- Do you realize there is actually nothing such as One-To-Many in RMDBS and all you do is deceive yourselves with Hibernate and others? \n- You realize SQL is already simple enough\n- You use PostgreSQL \n- You realize you can define functions inside DB instead of the your application code\n- How many times you debugged an ORM?\n- Do you want another micro-service to your next-gen-kubernetes-based application?\n\n**Note:** It is a work on progress.\n\n## Installation\n\n```bash\ngo get -u github.com/mustafaakin/gopqgen\n```\n\n## TODO Listgit \n\n- [X] List tables and fields\n- [X] Find enums\n- [X] List views\n- [ ] Composite types\n- [X] Generate getters for indexes (pkey and other composite keys)\n- [X] User defined functions\n- [ ] Generate functions from references foreign keys\n- [ ] Update function\n- [ ] gRPC Server implementation\n\n## Example\n\nFor given this schema, it generates an almost valid gRPC right now.\n\nSQL:\n\n```sql\nCREATE TABLE student (\n  id SERIAL PRIMARY KEY,\n  name TEXT,\n  email TEXT,\n  password BYTEA,\n  age INT\n);\n\nCREATE TABLE teacher (\n  id  SERIAL PRIMARY KEY,\n  name TEXT\n);\n\nCREATE TYPE severity AS ENUM ('Easy', 'Medium', 'Hard');\n\nCREATE TABLE course(\n  id        SERIAL PRIMARY KEY,\n  title     TEXT,\n  teacherId INT REFERENCES teacher(id),\n  severity  severity\n);\n\nCREATE TABLE membership (\n  courseId INT REFERENCES course(id),\n  studentId INT REFERENCES student(id)\n);\n\n-- Not that you need something like it, but just imagine\nCREATE FUNCTION add(integer, integer) RETURNS integer AS\n  'select $1 + $2;' LANGUAGE SQL\nIMMUTABLE RETURNS NULL ON NULL INPUT;\n\nCREATE FUNCTION IsUserInCourse(_studentId integer, _courseid integer) RETURNS boolean AS\n  'select exists(select 1 from membership where studentId = _studentid AND courseid = _courseid)' LANGUAGE SQL;\n\nCREATE FUNCTION GetStudentsOfCourse(_courseId integer) RETURNS TABLE(name text, email text) AS\n  'SELECT s.name, s.email FROM\n    course c,\n    student s,\n    membership m\n  WHERE\n    c.id = m.courseid AND\n    s.id = m.studentid AND\n    c.id = _courseId'\nLANGUAGE SQL;\n```\n\ngRPC Proto:\n\n```proto\nsyntax = \"proto3\";\n\n// Enums\nenum severity {\n    UNKNOWN = 0;\n    Easy = 1;\n    Medium = 2;\n    Hard = 3;\n}\n\n// Messages, Field Types\nmessage teacher {\n    int32 id = 1;\n    string name = 2;\n}\n\nmessage AddArg {\n    int32 var1 = 1;\n    int32 var2 = 2;\n}\n\nmessage GetstudentsofcourseOut {\n    string name = 1;\n    string email = 2;\n}\n\nmessage IsuserincourseArg {\n    int32 _studentid = 1;\n    int32 _courseid = 2;\n}\n\nmessage course {\n    int32 id = 1;\n    string title = 2;\n    int32 teacherid = 3;\n    severity severity = 4;\n}\n\nmessage membership {\n    int32 courseid = 1;\n    int32 studentid = 2;\n}\n\nmessage student {\n    int32 id = 1;\n    string name = 2;\n    string email = 3;\n    bytes password = 4;\n    int32 age = 5;\n}\n\n// Service Definition\nservice DatabaseService {\n    // SELECT id, title, teacherid, severity FROM course\n    rpc ListCourse(VoidRequest) returns (stream course) {}\n    // SELECT * FROM getstudentsofcourse($1)\n    rpc Getstudentsofcourse(int32) returns (GetstudentsofcourseOut) {}\n    // SELECT id, title, teacherid, severity FROM course WHERE `id` = $1\n    rpc GetCourseById(int32) returns (course) {}\n    // SELECT id, name, email, password, age FROM student WHERE `id` = $1\n    rpc GetStudentById(int32) returns (student) {}\n    // SELECT id, name FROM teacher WHERE `id` = $1\n    rpc GetTeacherById(int32) returns (teacher) {}\n    // SELECT * FROM add($1, $2)\n    rpc Add(AddArg) returns (int32) {}\n    // SELECT * FROM isuserincourse($1, $2)\n    rpc Isuserincourse(IsuserincourseArg) returns (bool) {}\n    // SELECT courseid, studentid FROM membership\n    rpc ListMembership(VoidRequest) returns (stream membership) {}\n    // SELECT id, name, email, password, age FROM student\n    rpc ListStudent(VoidRequest) returns (stream student) {}\n    // SELECT id, name FROM teacher\n    rpc ListTeacher(VoidRequest) returns (stream teacher) {}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmustafaakin%2Fgopqgen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmustafaakin%2Fgopqgen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmustafaakin%2Fgopqgen/lists"}