df_generate_dart_models 0.17.1
df_generate_dart_models: ^0.17.1 copied to clipboard
A tool for generating data models and classes from annotations, offering greater flexibility than json_serializable or freezed.
Generates Dart data models from @GenerateDartModel annotations. Pairs with df_generate_dart_models_core, which supplies the annotations and base Model class.
Install #
Add the runtime dependency to your project:
dependencies:
df_generate_dart_models_core: ^0.10.0
Install the generator CLI globally:
dart pub global activate df_generate_dart_models
Use #
Define a model template:
import 'package:df_generate_dart_models_core/df_generate_dart_models_core.dart';
part '_model_user.g.dart';
@GenerateDartModel(
fields: {
Field(fieldPath: ['id'], fieldType: String),
Field(fieldPath: ['firstName'], fieldType: String, nullable: true),
Field(fieldPath: ['lastName'], fieldType: String, nullable: true),
},
shouldInherit: true,
)
abstract class _ModelUser extends Model {
const _ModelUser();
}
From the folder containing the template, run:
df_generate_dart_models --models-min
This writes the generated part file (e.g. _model_user.g.dart) next to it.
A VS Code extension is also available — right-click the folder and pick 🔹 Generate Dart Models (Minimal).
Generate models from an existing DBML schema #
If you already have a DBML file, you can go the other direction — generate annotated Dart models from it. The reverse generator runs the forward codegen automatically, so a single command takes you from .dbml to ready-to-use Model* classes:
df_generate_dart_models_from_dbml -i schema.dbml -o lib/src/db_models --dialect postgres
--dialect postgres|sqlite|genericcontrols the type-prefix vocabulary. Postgres-flavoured columns (jsonb,bytea,enum(name),timestamptz, …) becomePG_*-field types so the existing PG mappers fire at runtime.- Declared
Enum {…}blocks become real Dart enums in a shareddbml_enums.dart, referenced by Type literal from each model. Ref:lines (and inline[ref: > table.col]notes) becomereferences:+foreignKey:annotations.- Right-click a
.dbmlfile in VS Code and pick🔹 Generate Dart Models from DBMLto run the same pipeline.
Pass --no-codegen if you only want the annotation source files without the matching _*.g.dart.
Generate a DBML schema from your models #
The inverse path also ships in the same package:
df_generate_dbml -i lib/src/db_models -o schema/
Walks every @GenerateDartModel-annotated file under the input directory, groups them by schema: value, and writes one <schema>.dbml per distinct schema. Enum-typed fields produce Enum "<name>" { … } blocks and enum(<name>) columns automatically — the variants are resolved via the analyzer, so no side-config is needed.
Generate SQL CREATE TABLE from your models #
The DBML emitter is the bridge to SQL. dbml2sql (a Node CLI) converts the .dbml to dialect-specific CREATE TABLE statements — including CREATE TYPE … AS ENUM for declared enums, foreign-key constraints, composite primary keys, and NOT NULL. End-to-end:
# 1) Models → DBML (round-trips through this package).
df_generate_dbml -i lib/src/db_models -o schema/
# 2) DBML → SQL (one-time install of dbml2sql).
npm install -g @dbml/cli
dbml2sql --postgres schema/app.dbml > schema/app.postgres.sql
dbml2sql --mysql schema/app.dbml > schema/app.mysql.sql
dbml2sql --mssql schema/app.dbml > schema/app.mssql.sql
Because the PG_*- / SQLITE_*- prefixes on your fieldType strings drive the DBML column types directly (PG_varchar(120)-String → varchar(120), PG_jsonb-Map → jsonb, PG_bytea-Uint8List → bytea, an enum-typed field → enum(<name>)), the resulting SQL matches the Postgres / SQLite dialect you've already pinned in your Dart models — no separate migration spec needed.
🔍 For more information, refer to the API reference.
💬 Contributing and Discussions #
This is an open-source project, and we warmly welcome contributions from everyone, regardless of experience level. Whether you're a seasoned developer or just starting out, contributing to this project is a fantastic way to learn, share your knowledge, and make a meaningful impact on the community.
☝️ Ways you can contribute #
- Find us on Discord: Feel free to ask questions and engage with the community here: https://discord.gg/gEQ8y2nfyX.
- Share your ideas: Every perspective matters, and your ideas can spark innovation.
- Help others: Engage with other users by offering advice, solutions, or troubleshooting assistance.
- Report bugs: Help us identify and fix issues to make the project more robust.
- Suggest improvements or new features: Your ideas can help shape the future of the project.
- Help clarify documentation: Good documentation is key to accessibility. You can make it easier for others to get started by improving or expanding our documentation.
- Write articles: Share your knowledge by writing tutorials, guides, or blog posts about your experiences with the project. It's a great way to contribute and help others learn.
No matter how you choose to contribute, your involvement is greatly appreciated and valued!
☕ We drink a lot of coffee... #
If you're enjoying this package and find it valuable, consider showing your appreciation with a small donation. Every bit helps in supporting future development. You can donate here: https://www.buymeacoffee.com/dev_cetera
LICENSE #
This project is released under the MIT License. See LICENSE for more information.