diff --git a/psl/parser-database/src/walkers/relation/implicit_many_to_many.rs b/psl/parser-database/src/walkers/relation/implicit_many_to_many.rs index 989f14e941ce..f47f793e45ca 100644 --- a/psl/parser-database/src/walkers/relation/implicit_many_to_many.rs +++ b/psl/parser-database/src/walkers/relation/implicit_many_to_many.rs @@ -73,6 +73,11 @@ impl<'db> ImplicitManyToManyRelationWalker<'db> { pub fn table_name(self) -> ImplicitManyToManyRelationTableName<'db> { ImplicitManyToManyRelationTableName(self.relation_name()) } + + /// The relation starts or ends to a view. + pub fn one_side_is_view(self) -> bool { + self.model_a().ast_model().is_view() || self.model_b().ast_model().is_view() + } } /// A table name for an implicit relation's join table. Useful for its Display impl. diff --git a/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator.rs b/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator.rs index d08bedabe0dd..42e2cc0897a0 100644 --- a/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator.rs +++ b/schema-engine/connectors/sql-schema-connector/src/sql_schema_calculator.rs @@ -185,7 +185,8 @@ fn push_relation_tables(ctx: &mut Context<'_>) { let m2m_relations = datamodel .db .walk_relations() - .filter_map(|relation| relation.refine().as_many_to_many()); + .filter_map(|relation| relation.refine().as_many_to_many()) + .filter(|m2m| !m2m.one_side_is_view()); for m2m in m2m_relations { let table_name = m2m.table_name().to_string(); diff --git a/schema-engine/sql-migration-tests/tests/migrations/views.rs b/schema-engine/sql-migration-tests/tests/migrations/views.rs index ddb06f549092..1228d8a9772a 100644 --- a/schema-engine/sql-migration-tests/tests/migrations/views.rs +++ b/schema-engine/sql-migration-tests/tests/migrations/views.rs @@ -18,3 +18,30 @@ fn nothing_gets_written_in_migrations(api: TestApi) { let expected_sql = expect!["-- This is an empty migration."]; api.expect_sql_for_schema(dm, &expected_sql); } + +#[test_connector(preview_features("views"))] +fn creates_no_m2m_relations_to_views(api: TestApi) { + let dm = indoc! {r#" + generator js { + provider = "prisma-client-javascript" + previewFeatures = ["views"] + } + + model Organization { + id Int @id + viewUsers ViewUser[] + } + + view ViewUser { + userId Int @id @unique + organizations Organization[] + } + "#}; + + api.schema_push_w_datasource(dm).send().assert_green(); + + api.assert_schema().assert_has_no_view("ViewUser"); + api.assert_schema().assert_table("Organization", |table| { + table.assert_has_column("id").assert_does_not_have_column("viewUsers") + }); +}