SeaQL / sea-orm

🐚 An async & dynamic ORM for Rust
https://www.sea-ql.org/SeaORM/
Apache License 2.0
6.56k stars 459 forks source link

Clarification on Relationship Generation in sea-orm-cli Based on ForeignKey Constraints #2216

Open Ethan1225 opened 1 month ago

Ethan1225 commented 1 month ago

Hello sea-orm team,

I am encountering a situation where the sea-orm-cli generate entity command generates different relationship annotations based on how the foreign key constraints are specified in the SQLite schema. Specifically, there seems to be a difference in behavior when the UNIQUE keyword is used.

Here's a detailed example using two tables, Authors and Books, to illustrate my point:

Schema Definition

CREATE TABLE Authors (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL
);

CREATE TABLE Books (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    authorID INTEGER,
    title TEXT NOT NULL,
    FOREIGN KEY (authorID) REFERENCES Authors(ID)
);

CREATE UNIQUE INDEX idx_books_author ON Books (authorID);

With this schema, I expect that the relationship generated should indicate a one-to-one relationship (has_one) between Authors and Books due to the unique index on Books.authorID. However, the behavior seems inconsistent depending on the placement and usage of UNIQUE constraints directly in the table definition versus the creation of a unique index separately.

Could you please clarify the following:

How does sea-orm-cli generate entity determine when to generate #[sea_orm(has_one = "related_entity")] vs #[sea_orm(has_many = "related_entity")]? Is there a recommended way of defining foreign keys and unique constraints in the schema to ensure consistent relationship generation? Any guidance or clarification on this matter would be greatly appreciated.

Thank you for your assistance!

Versions

β”œβ”€β”€ sea-orm v0.12.14 β”‚ β”œβ”€β”€ sea-orm-macros v0.12.14 (proc-macro) β”‚ β”‚ β”œβ”€β”€ sea-bae v0.2.0 (proc-macro) β”‚ β”œβ”€β”€ sea-query v0.30.7 β”‚ β”‚ β”œβ”€β”€ sea-query-derive v0.4.1 (proc-macro) β”‚ β”œβ”€β”€ sea-query-binder v0.5.0 β”‚ β”‚ β”œβ”€β”€ sea-query v0.30.7 () β”œβ”€β”€ sea-query v0.30.7 () β”‚ β”œβ”€β”€ sea-orm v0.12.14 () β”‚ β”œβ”€β”€ sea-query v0.30.7 ()