https://github.com/ehne/ERDot
A python CLI script to create Entity Relationship Diagrams from JSON/YAML code.
https://github.com/ehne/ERDot
dot entity-relationship-diagram erd graphvis python
Last synced: about 1 year ago
JSON representation
A python CLI script to create Entity Relationship Diagrams from JSON/YAML code.
- Host: GitHub
- URL: https://github.com/ehne/ERDot
- Owner: ehne
- License: mit
- Created: 2020-06-26T00:23:04.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-01-29T15:26:37.000Z (over 2 years ago)
- Last Synced: 2024-10-02T14:39:25.116Z (over 1 year ago)
- Topics: dot, entity-relationship-diagram, erd, graphvis, python
- Language: Python
- Homepage:
- Size: 158 KB
- Stars: 73
- Watchers: 5
- Forks: 12
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
Welcome to ERDot 👋
> Creates Entity Relationship Diagrams from JSON/YAML code.
## Installation
to install ERDot:
```pip install ERDot```
you may also need to [install graphvis](https://graphviz.org/download/) to be able to create images of the dot files generated. If you don't want to install graphviz, you can copy the contents of the generated dot file into an [online grapviz viewer](https://edotor.net).
## CLI Usage
```bash
Usage: erdot [OPTIONS] INPUTFILE
ERDot generates graphvis .dot files from the .json/.yml files INPUTFILE.
Options:
-o, --outputFile TEXT The graphvis dot file to write (.dot)
-q, --quiet Suppresses program information messages.
--help Show this message and exit.
```
Note that after generating the .dot file, you will still need to output it to your desired format using graphviz. An example of how to do this:
```bash
$ erdot example.erd.json
$ dot example.dot -Tpng -o imageFile.png
```
(You could also copy and paste the contents of the .dot file into an [online graphviz viewer](https://edotor.net))
## ERDJSON format:
```json
{
"tables":{
...
},
"relations":[
...
],
"rankAdjustments":"...",
"label":"..."
}
```
Every single one of these sections are required, however, if you dont need that specific feature (for example label or rankAdjustments), just leave the value blank
### table:
Each table inside of the table section of the ERDJSON document is formated like this:
```json
"TableName": {
"*PrimaryKey": "Int(10)",
"+ForeignKey": "Int(10)",
"RandomData": "Char(70)"
}
```
the general idea is that the key is the column name, and the value is the type.
you will also notice the `*` and `+` next to the column names, these indicate primary and foriegn keys respectively. You can combine two of these together into a primary foreign key (a composite key consisting of two foreign keys), just by putting both a `*` and a `+` next to the name.
### relations:
each element in the relations array of the ERDJSON document is formatted like this:
```json
"TableOne:PrimaryKey 1--* TableTwo:ForeignKey"
```
There are three elements that make up the relation string, (1) the left hand side, (2) the cardinality indicator, and (3) the right hand side.
#### Left and Right hand side:
The sides of the relation string consist of two elements, separated by a `:`. the text before the `:` indicates what table it is in, and the text after the `:` indicates what specific column it should use to link. (note how you dont include the `+` or `*` in the specific column text).
#### Cardinality indicator:
Each relationship must have two of these cardinalities in the indicator, separated by `--`:
```
Cardinality Syntax
0 or 1 ?
exactly 1 1
0 or more *
1 or more +
```
So for example, the following defines a relationship between Person's birthplaceID foreign key and BirthPlace's ID primary key that reads "every person has exactly one birth place, linked together using the birthplaceID":
```python
Person:birthplaceID *--1 BirthPlace:ID
```
### rankAdjustments
applies graphvis' rank adjustments to adjust where the tables appear in the final image. (note that it is only one string)
```js
{ rank=min; TableOne Tabletwo }; // sets TableOne and TableTwo to be in the minimum rank (left)
{ rank=same; TableThree TableFour }; // sets TableThree and TableFour to be in the same rank
{ rank=max; TableFive }; // sets TableFive to be in the maximum rank (right)
```
### Label
a string that sets what label will be drawn on top of the ERD, think of it like the title of the ERD.
## Example ERDJSON:
```json
{
"tables":{
"Person":{
"*name":"char()",
"height":"int()",
"weight":"int()",
"birthDate":"date()",
"+birthPlaceID":"int()"
},
"BirthPlace":{
"*id":"int()",
"birthCity":"char()",
"birthState":"char()",
"birthCountry":"char()"
}
},
"relations":[
"Person:birthPlaceID *--1 BirthPlace:id"
],
"rankAdjustments":"",
"label":""
}
```
which then creates this image:

The ERDYAML of the same image would look like:
```yaml
tables:
Person:
"*name": char()
height: int()
weight: int()
birthDate: date()
"+birthPlaceID": int()
BirthPlace:
"*id": int()
birthCity: char()
birthState: char()
birthCountry: char()
relations:
- Person:birthPlaceID *--1 BirthPlace:id
rankAdjustments: ''
label: ''
```
## Author
👤 **ehne**
* Github: [@ehne](https://github.com/ehne)
## Show your support
Give a ⭐️ if this project helped you!
***
_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_