112 lines
3.5 KiB
Markdown
112 lines
3.5 KiB
Markdown
---
|
|
sidebar_position: 4
|
|
---
|
|
|
|
# Project layout
|
|
|
|
When you generate a new project with `m4g init <project_name>`, it will create a folder like the example below.
|
|
|
|
```
|
|
📦<project_name>
|
|
┣ 📂.git
|
|
┣ 📂.venv
|
|
┣ 📂api
|
|
┃ ┗ 📂routers
|
|
┃ ┃ ┗ 📜hello.py
|
|
┣ 📂db
|
|
┃ ┣ 📂engine
|
|
┃ ┃ ┗ 📜async_session.py
|
|
┃ ┣ 📂entities
|
|
┃ ┃ ┗ 📜entity_base.py
|
|
┃ ┣ 📂versions
|
|
┃ ┣ 📜README
|
|
┃ ┣ 📜env.py
|
|
┃ ┣ 📜script.py.mako
|
|
┃ ┗ 📜settings.py
|
|
┣ 📜.gitignore
|
|
┣ 📜alembic.ini
|
|
┣ 📜db.docker-compose.yml
|
|
┣ 📜m4g.json
|
|
┣ 📜main.py
|
|
┗ 📜requirements.txt
|
|
```
|
|
|
|
Let's go through these one by one.
|
|
|
|
### .git
|
|
|
|
The `m4g init` command will initialize new projects with git by default.
|
|
If you don't want to use git you can pass the option `--without git` to `m4g init`.
|
|
|
|
### .venv
|
|
|
|
To promote isolation of Python dependencies, new projects are initialized with a virtual environment by default.
|
|
When you clone a MycroForge repository from git, it won't have a `.venv` folder yet.
|
|
You can run `m4g hydrate` in the root folder of the project to restore the dependencies.
|
|
|
|
### api/routers/hello.py
|
|
|
|
This file defines a basic example router, which is imported and mapped in `main.py`. This router is just an example and
|
|
can be removed or modified at you discretion.
|
|
|
|
### db/engine/async_session.py
|
|
|
|
This file defines the `async_session` function, which can be used to open an asynchronous session to a database.
|
|
|
|
### db/entities/entity_base.py
|
|
|
|
This file contains an automatically generated entity base class that derives from the DeclarativeBase.
|
|
All entities must inherit from this class, so that SQLAlchemy & alembic can track them. The entities directory is also
|
|
where all newly generated entities will be stored.
|
|
|
|
### db/versions
|
|
|
|
This is where the generated database migrations will be stored.
|
|
|
|
### db/README
|
|
|
|
This README file is automatically generated by the alembic init command.
|
|
|
|
### db/env.py
|
|
|
|
This is the database environment file that is used by alembic to interact with the database.
|
|
If you take a closer look at the imports, you'll see that the file has been modified to assign `EntityBase.metadata` to
|
|
a variable called `target_metadata`, this will allow alembic to track changes in your entities. You'll also find that
|
|
the `DbSettings` class is used to get the connectionstring. Any time you generate a new database entity, or create a
|
|
many-to-many relation between two entities, this file will also be modified to include the generated classes.
|
|
|
|
### db/script.py.mako
|
|
|
|
This file is automatically generated by the alembic init command.
|
|
|
|
### db/settings.py
|
|
|
|
This file defines the `DbSettings` class, that is responsible for retrieving the database connectionstring.
|
|
You will probably want to modify this class to retrieve the connectionstring from a secret manager at some point.
|
|
|
|
### .gitignore
|
|
|
|
The default .gitignore file that is generated by the `m4g init` command. Modify this file at your discretion.
|
|
|
|
### alembic.ini
|
|
|
|
This file is automatically generated by the alembic init command.
|
|
|
|
### db.docker-compose.yml
|
|
|
|
A docker compose file for running a database locally.
|
|
|
|
### m4g.json
|
|
|
|
This file contains some configs that are used by the CLI, for example the ports to map to the API and database.
|
|
|
|
### main.py
|
|
|
|
The entrypoint for the application. When generating entities, many-to-many relations or routers, this file will be
|
|
modified to include the generated files.
|
|
|
|
### requirements.txt
|
|
|
|
The requirements file containing the Python dependencies.
|
|
Whenever you run `m4g install` or `m4g uninstall` this file will be updated too.
|