项目作者: mustafaakin

项目描述 :
Generates the Go structs and getters/setters for PostgreSQL Database
高级语言: Go
项目地址: git://github.com/mustafaakin/gopqgen.git
创建时间: 2017-02-02T07:26:12Z
项目社区:https://github.com/mustafaakin/gopqgen

开源协议:Apache License 2.0

下载


gopqgen

This project aims to generate common CRUD operations for a given PostgreSQL database and expose them as a gRPC API.

Why?

  • Are you tired of writing CRUD?
  • 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?
  • You realize SQL is already simple enough
  • You use PostgreSQL
  • You realize you can define functions inside DB instead of the your application code
  • How many times you debugged an ORM?
  • Do you want another micro-service to your next-gen-kubernetes-based application?

Note: It is a work on progress.

Installation

  1. go get -u github.com/mustafaakin/gopqgen

TODO Listgit

  • [X] List tables and fields
  • [X] Find enums
  • [X] List views
  • Composite types
  • [X] Generate getters for indexes (pkey and other composite keys)
  • [X] User defined functions
  • Generate functions from references foreign keys
  • Update function
  • gRPC Server implementation

Example

For given this schema, it generates an almost valid gRPC right now.

SQL:

  1. CREATE TABLE student (
  2. id SERIAL PRIMARY KEY,
  3. name TEXT,
  4. email TEXT,
  5. password BYTEA,
  6. age INT
  7. );
  8. CREATE TABLE teacher (
  9. id SERIAL PRIMARY KEY,
  10. name TEXT
  11. );
  12. CREATE TYPE severity AS ENUM ('Easy', 'Medium', 'Hard');
  13. CREATE TABLE course(
  14. id SERIAL PRIMARY KEY,
  15. title TEXT,
  16. teacherId INT REFERENCES teacher(id),
  17. severity severity
  18. );
  19. CREATE TABLE membership (
  20. courseId INT REFERENCES course(id),
  21. studentId INT REFERENCES student(id)
  22. );
  23. -- Not that you need something like it, but just imagine
  24. CREATE FUNCTION add(integer, integer) RETURNS integer AS
  25. 'select $1 + $2;' LANGUAGE SQL
  26. IMMUTABLE RETURNS NULL ON NULL INPUT;
  27. CREATE FUNCTION IsUserInCourse(_studentId integer, _courseid integer) RETURNS boolean AS
  28. 'select exists(select 1 from membership where studentId = _studentid AND courseid = _courseid)' LANGUAGE SQL;
  29. CREATE FUNCTION GetStudentsOfCourse(_courseId integer) RETURNS TABLE(name text, email text) AS
  30. 'SELECT s.name, s.email FROM
  31. course c,
  32. student s,
  33. membership m
  34. WHERE
  35. c.id = m.courseid AND
  36. s.id = m.studentid AND
  37. c.id = _courseId'
  38. LANGUAGE SQL;

gRPC Proto:

  1. syntax = "proto3";
  2. // Enums
  3. enum severity {
  4. UNKNOWN = 0;
  5. Easy = 1;
  6. Medium = 2;
  7. Hard = 3;
  8. }
  9. // Messages, Field Types
  10. message teacher {
  11. int32 id = 1;
  12. string name = 2;
  13. }
  14. message AddArg {
  15. int32 var1 = 1;
  16. int32 var2 = 2;
  17. }
  18. message GetstudentsofcourseOut {
  19. string name = 1;
  20. string email = 2;
  21. }
  22. message IsuserincourseArg {
  23. int32 _studentid = 1;
  24. int32 _courseid = 2;
  25. }
  26. message course {
  27. int32 id = 1;
  28. string title = 2;
  29. int32 teacherid = 3;
  30. severity severity = 4;
  31. }
  32. message membership {
  33. int32 courseid = 1;
  34. int32 studentid = 2;
  35. }
  36. message student {
  37. int32 id = 1;
  38. string name = 2;
  39. string email = 3;
  40. bytes password = 4;
  41. int32 age = 5;
  42. }
  43. // Service Definition
  44. service DatabaseService {
  45. // SELECT id, title, teacherid, severity FROM course
  46. rpc ListCourse(VoidRequest) returns (stream course) {}
  47. // SELECT * FROM getstudentsofcourse($1)
  48. rpc Getstudentsofcourse(int32) returns (GetstudentsofcourseOut) {}
  49. // SELECT id, title, teacherid, severity FROM course WHERE `id` = $1
  50. rpc GetCourseById(int32) returns (course) {}
  51. // SELECT id, name, email, password, age FROM student WHERE `id` = $1
  52. rpc GetStudentById(int32) returns (student) {}
  53. // SELECT id, name FROM teacher WHERE `id` = $1
  54. rpc GetTeacherById(int32) returns (teacher) {}
  55. // SELECT * FROM add($1, $2)
  56. rpc Add(AddArg) returns (int32) {}
  57. // SELECT * FROM isuserincourse($1, $2)
  58. rpc Isuserincourse(IsuserincourseArg) returns (bool) {}
  59. // SELECT courseid, studentid FROM membership
  60. rpc ListMembership(VoidRequest) returns (stream membership) {}
  61. // SELECT id, name, email, password, age FROM student
  62. rpc ListStudent(VoidRequest) returns (stream student) {}
  63. // SELECT id, name FROM teacher
  64. rpc ListTeacher(VoidRequest) returns (stream teacher) {}
  65. }