{"id":13412001,"url":"https://github.com/khezen/avro","last_synced_at":"2025-08-21T00:31:51.938Z","repository":{"id":49982631,"uuid":"179962535","full_name":"khezen/avro","owner":"khezen","description":"Apache AVRO for go","archived":false,"fork":false,"pushed_at":"2024-07-15T11:30:08.000Z","size":253,"stargazers_count":45,"open_issues_count":0,"forks_count":10,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-07-31T20:49:35.117Z","etag":null,"topics":["apache","avro","etl","go","golang","redshift","sql"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/khezen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2019-04-07T12:22:46.000Z","updated_at":"2024-07-15T11:24:56.000Z","dependencies_parsed_at":"2024-10-26T15:40:00.178Z","dependency_job_id":null,"html_url":"https://github.com/khezen/avro","commit_stats":null,"previous_names":[],"tags_count":10,"template":true,"template_full_name":null,"purl":"pkg:github/khezen/avro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khezen%2Favro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khezen%2Favro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khezen%2Favro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khezen%2Favro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/khezen","download_url":"https://codeload.github.com/khezen/avro/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/khezen%2Favro/sbom","scorecard":{"id":559004,"data":{"date":"2025-08-11","repo":{"name":"github.com/khezen/avro","commit":"2053f2298a37e1a1a2d1058c18d1a322e45ab774"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/checks.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: downloadThenRun not pinned by hash: .github/workflows/checks.yml:51","Info:   0 out of   1 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T13:07:32.292Z","repository_id":49982631,"created_at":"2025-08-20T13:07:32.292Z","updated_at":"2025-08-20T13:07:32.292Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271409417,"owners_count":24754711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["apache","avro","etl","go","golang","redshift","sql"],"created_at":"2024-07-30T20:01:19.985Z","updated_at":"2025-08-21T00:31:51.628Z","avatar_url":"https://github.com/khezen.png","language":"Go","readme":"# *avro*\n\n[![Build Status](https://github.com/khezen/avro/workflows/build/badge.svg?branch=master)](https://github.com/khezen/avro/actions?query=workflow%3Abuild) [![codecov](https://img.shields.io/codecov/c/github/khezen/avro/master.svg)](https://codecov.io/gh/khezen/avro)\n[![Go Report Card](https://goreportcard.com/badge/github.com/khezen/avro)](https://goreportcard.com/report/github.com/khezen/avro)\n\nThe purpose of this package is to facilitate use of AVRO with `go` strong typing.\n\n## Features\n\n### `github.com/khezen/avro`\n\n[![GoDoc](https://img.shields.io/badge/go-documentation-blue.svg)](https://godoc.org/github.com/khezen/avro)\n\n* [Marshal/Unmarshal AVRO schema](#schema-marshalunmarshal)\n\n### `github.com/khezen/avro/sqlavro`\n\n[![GoDoc](https://img.shields.io/badge/go-documentation-blue.svg)](https://godoc.org/github.com/khezen/avro/sqlavro)\n\n* [Discover SQL tables](#convert-sql-table-to-avro-schema)\n* [Convert SQL tables to AVRO schemas](#convert-sql-table-to-avro-schema)\n* [Query records from SQL into AVRO or CSV binary](#query-records-from-sql-into-avro-or-csv-binary)\n\n### `github.com/khezen/avro/redshiftavro`\n\n[![GoDoc](https://img.shields.io/badge/go-documentation-blue.svg)](https://godoc.org/github.com/khezen/avro/redshiftavro)\n\n* [Produce Redshit create statement from AVRO schema](#produce-redshift-create-statement-from-avro-schema)\n\n## What is AVRO\n\n[Apache AVRO](http://avro.apache.org/docs/current/spec.html) is a data serialization system which relies on JSON schemas.\n\nIt provides:\n\n* Rich data structures\n* A compact, fast, binary data format\n* A container file, to store persistent data\n* Remote procedure call (RPC)\n\nAVRO binary encoded data comes together with its schema and therefore is fully self-describing.\n\nWhen AVRO data is read, the schema used when writing it is always present. This permits each datum to be written with no per-value overheads, making serialization both fast and small.\n\nWhen AVRO data is stored in a file, its schema is stored with it, so that files may be processed later by any program. If the program reading the data expects a different schema this can be easily resolved, since both schemas are present.\n\n## Examples\n\n### Schema Marshal/Unmarshal\n\n```golang\npackage main\n\nimport (\n  \"encoding/json\"\n  \"fmt\"\n\n  \"github.com/khezen/avro\"\n)\n\nfunc main() {\n  schemaBytes := []byte(\n    `{\n      \"type\": \"record\",\n      \"namespace\": \"test\",\n      \"name\": \"LongList\",\n      \"aliases\": [\n        \"LinkedLongs\"\n      ],\n      \"doc\": \"linked list of 64 bits integers\",\n      \"fields\": [\n        {\n          \"name\": \"value\",\n          \"type\": \"long\"\n        },\n        {\n          \"name\": \"next\",\n          \"type\": [\n            \"null\",\n            \"LongList\"\n          ]\n        }\n      ]\n    }`,\n  )\n\n  // Unmarshal JSON  bytes to Schema interface\n  var anySchema avro.AnySchema\n  err := json.Unmarshal(schemaBytes, \u0026anySchema)\n  if err != nil {\n    panic(err)\n  }\n  schema := anySchema.Schema()  \n  // Marshal Schema interface to JSON bytes\n  schemaBytes, err = json.Marshal(schema)\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(string(schemaBytes))\n}\n```\n\n```json\n{\n    \"type\": \"record\",\n    \"namespace\": \"test\",\n    \"name\": \"LongList\",\n    \"aliases\": [\n        \"LinkedLongs\"\n    ],\n    \"doc\": \"linked list of 64 bits integers\",\n    \"fields\": [\n        {\n            \"name\": \"value\",\n            \"type\": \"long\"\n        },\n        {\n            \"name\": \"next\",\n            \"type\": [\n                \"null\",\n                \"LongList\"\n            ]\n        }\n    ]\n}\n```\n\n### Convert SQL Table to AVRO Schema\n\n```golang\npackage main\nimport (\n  \"database/sql\"\n  \"encoding/json\"\n  \"fmt\"\n\n  \"github.com/khezen/avro/sqlavro\"\n)\n\nfunc main() {\n  db, err := sql.Open(\"mysql\", \"root@/blog\")\n  if err != nil {\n    panic(err)\n  }\n  defer db.Close()\n  _, err = db.Exec(\n    `CREATE TABLE posts(\n      ID INT NOT NULL,\n      title VARCHAR(128) NOT NULL,\n      body LONGBLOB NOT NULL,\n      content_type VARCHAR(128) DEFAULT 'text/markdown; charset=UTF-8',\n      post_date DATETIME NOT NULL,\n      update_date DATETIME,\n      reading_time_minutes DECIMAL(3,1),\n      PRIMARY KEY(ID)\n    )`,\n  )\n  if err != nil {\n    panic(err)\n  }\n  schemas, err := sqlavro.SQLDatabase2AVRO(db, \"blog\")\n  if err != nil {\n    panic(err)\n  }\n  schemasBytes, err := json.Marshal(schemas)\n  if err != nil {\n    panic(err)\n  }\n  fmt.Println(string(schemasBytes))\n}\n```\n\n```json\n[\n    {\n        \"type\": \"record\",\n        \"namespace\": \"blog\",\n        \"name\": \"posts\",\n        \"fields\": [\n            {\n                \"name\": \"ID\",\n                \"type\": \"int\"\n            },\n            {\n                \"name\": \"title\",\n                \"type\": \"string\"\n            },\n            {\n                \"name\": \"body\",\n                \"type\": \"bytes\"\n            },\n            {\n                \"name\": \"content_type\",\n                \"type\": [\n                    \"string\",\n                    \"null\"\n                ],\n                \"default\": \"text/markdown; charset=UTF-8\"\n            },\n            {\n                \"name\": \"post_date\",\n                \"type\": {\n                    \"type\": \"int\",\n                    \"doc\":\"datetime\",\n                    \"logicalType\": \"timestamp\"\n                }\n            },\n            {\n                \"name\": \"update_date\",\n                \"type\": [\n                    \"null\",\n                    {\n                        \"type\": \"int\",\n                        \"doc\":\"datetime\",\n                        \"logicalType\": \"timestamp\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"reading_time_minutes\",\n                \"type\": [\n                    \"null\",\n                    {\n                        \"type\": \"bytes\",\n                        \"logicalType\": \"decimal\",\n                        \"precision\": 3,\n                        \"scale\": 1\n                    }\n                ]\n            }\n        ]\n    }\n]\n```\n\n### Query records from SQL into AVRO or CSV binary\n\n```golang\npackage main\n\nimport (\n\t\"database/sql\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"time\"\n\n\t\"github.com/khezen/avro\"\n\t\"github.com/khezen/avro/sqlavro\"\n)\n\nfunc main() {\n\tdb, err := sql.Open(\"mysql\", \"root@/blog\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer db.Close()\n\t_, err = db.Exec(\n\t\t`CREATE TABLE posts(\n\t\t\tID INT NOT NULL,\n\t\t\ttitle VARCHAR(128) NOT NULL,\n\t\t\tbody LONGBLOB NOT NULL,\n\t\t\tcontent_type VARCHAR(128) DEFAULT 'text/markdown; charset=UTF-8',\n\t\t\tpost_date DATETIME NOT NULL,\n\t\t\tupdate_date DATETIME,\n\t\t\treading_time_minutes DECIMAL(3,1),\n\t\t\tPRIMARY KEY(ID)\n\t\t)`,\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t_, err = db.Exec(\n\t\t// statement\n\t\t`INSERT INTO posts(ID,title,body,content_type,post_date,update_date,reading_time_minutes)\n\t\t VALUES (?,?,?,?,?,?,?)`,\n\t\t// values\n\t\t42,\n\t\t\"lorem ispum\",\n\t\t[]byte(`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.`),\n\t\t\"text/markdown; charset=UTF-8\",\n\t\t\"2009-04-10 00:00:00\",\n\t\t\"2009-04-10 00:00:00\",\n\t\t\"4.2\",\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tschema, err := sqlavro.SQLTable2AVRO(db, \"blog\", \"posts\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tlimit := 1000\n\torder := avro.Ascending\n\tfrom, err := time.Parse(\"2006-02-01 15:04:05\", \"2009-04-10 00:00:00\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tavroBytes, updatedCriteria, err := sqlavro.Query(sqlavro.QueryConfig{\n\t\tDB:     db,\n\t\tDBName: \"blog\",\n\t\tSchema: schema,\n\t\tLimit:  limit,\n\t\tCriteria: []sqlavro.Criterion{\n\t\t\t*sqlavro.NewCriterionDateTime(\"post_date\", \u0026from, order),\n\t\t},\n\t\tOutput: \"avro\",\n\t})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\terr = ioutil.WriteFile(\"/tmp/blog_posts.avro\", avroBytes, 0644)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(updatedCriteria)\n}\n```\n\n#### Notes\n\n* When record fields contains aliases, the first alias is used in the query instead of the field name.\n\n## Types\n\n| Avro               | Go                       | SQL\n| ------------------ | ------------------------ | ---\n| `null`             | `nil`                    | `NULL`\n| `bytes`            | `[]byte`                 | `BLOB`,`MEDIUMBLOB`,`LONGBLOB`\n| `fixed`            | `[]byte`                 | `CHAR`,`NCHAR`\n| `string`,`enum`    | `string`                 | `VARCHAR`, `NVARCHAR`,`TEXT`,`TINYTEXT`,`MEDIUMTEXT`,`LONGTEXT`,`ENUM`,`SET`\n| `float`            | `float32`                | `FLOAT`\n| `double`           | `float64`                | `DOUBLE`\n| `long`             | `int64`                  | `BIGINT`\n| `int`              | `int32`                  | `TINYINT`,`SMALLINT`,`INT`,`YEAR`\n| `decimal`          | `*big.Rat`               | `DECIMAL`\n| `time`             | `int32`                  | `TIME`\n| `timestamp`        | `int32`                  | `TIMESTAMP`,`DATETIME`\n| `date`             | `time.Time`              | `DATE`\n| `array`            | `[]interface{}`          | **N/A**\n| `map`,`record`     | `map[string]interface{}` | **N/A**\n| `union`            | *see below*              | **any type nullable**\n\nBecause of encoding rules for Avro unions, when an union's value is\n`null`, a simple Go `nil` is returned. However when an union's value\nis non-`nil`, a Go `map[string]interface{}` with a single key is\nreturned for the union. The map's single key is the Avro type name and\nits value is the datum's value.\n\n### Produce Redshift create statement from AVRO schema\n\n```golang\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/khezen/avro\"\n\t\"github.com/khezen/avro/redshiftavro\"\n)\n\nfunc main() {\n\tschemaBytes := []byte(`\n\t{\n        \"type\": \"record\",\n        \"namespace\": \"blog\",\n        \"name\": \"posts\",\n        \"fields\": [\n            {\n                \"name\": \"ID\",\n                \"type\": \"int\"\n            },\n            {\n                \"name\": \"title\",\n                \"type\": \"string\"\n            },\n            {\n                \"name\": \"body\",\n                \"type\": \"bytes\"\n            },\n            {\n                \"name\": \"content_type\",\n                \"type\": [\n                    \"string\",\n                    \"null\"\n                ],\n                \"default\": \"text/markdown; charset=UTF-8\"\n            },\n            {\n                \"name\": \"post_date\",\n                \"type\": {\n                    \"type\": \"int\",\n                    \"doc\":\"datetime\",\n                    \"logicalType\": \"timestamp\"\n                }\n            },\n            {\n                \"name\": \"update_date\",\n                \"type\": [\n                    \"null\",\n                    {\n                        \"type\": \"int\",\n                        \"doc\":\"datetime\",\n                        \"logicalType\": \"timestamp\"\n                    }\n                ]\n            },\n            {\n                \"name\": \"reading_time_minutes\",\n                \"type\": [\n                    \"null\",\n                    {\n                        \"type\": \"bytes\",\n                        \"logicalType\": \"decimal\",\n                        \"precision\": 3,\n                        \"scale\": 1\n                    }\n                ]\n            }\n        ]\n\t}`)\n\tvar anySchema avro.AnySchema\n\terr := json.Unmarshal(schemaBytes, \u0026anySchema)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tschema := anySchema.Schema().(*avro.RecordSchema)\n\tcfg := redshiftavro.CreateConfig{\n\t\tSchema:      *schema,\n\t\tSortKeys:    []string{\"post_date\", \"title\"},\n\t\tIfNotExists: true,\n\t}\n\tstatement, err := redshiftavro.CreateTableStatement(cfg)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(statement)\n}\n```\n\n```sql\nCREATE TABLE IF NOT EXISTS posts(\n\tID INTEGER ENCODE LZO NOT NULL,\n\ttitle VARCHAR(65535) ENCODE RAW NOT NULL,\n\tbody VARCHAR(65535) ENCODE ZSTD NOT NULL,\n\tcontent_type VARCHAR(65535) ENCODE ZSTD NULL,\n\tpost_date TIMESTAMP WITHOUT TIME ZONE ENCODE RAW NOT NULL,\n\tupdate_date TIMESTAMP WITHOUT TIME ZONE ENCODE LZO NULL,\n\treading_time_minutes DECIMAL(3,1) ENCODE RAW NULL\n)\nSORTKEY(\n\tpost_date,\n\ttitle\n)\n```\n\n## Issues\n\nIf you have any problems or questions, please ask for help through a [GitHub issue](https://github.com/khezen/avro/issues).\n\n## Contributions\n\nHelp is always welcome! For example, documentation (like the text you are reading now) can always use improvement. There's always code that can be improved. If you ever see something you think should be fixed, you should own it. If you have no idea what to start on, you can browse the issues labeled with [help wanted](https://github.com/khezen/avro/labels/help%20wanted).\n\nAs a potential contributor, your changes and ideas are welcome at any hour of the day or night, weekdays, weekends, and holidays. Please do not ever hesitate to ask a question or send a pull request.\n\n[Code of conduct](https://github.com/khezen/avro/blob/master/CODE_OF_CONDUCT.md).\n","funding_links":[],"categories":["Database","Data Integration Frameworks","Uncategorized","Go","数据库  `go语言实现的数据库`","数据库","Generators"],"sub_categories":["Database Schema Migration","Advanced Console UIs","数据库模式迁移","标准 CLI"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhezen%2Favro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkhezen%2Favro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkhezen%2Favro/lists"}