Skip to content

Commit 55b0ab7

Browse files
authored
Merge pull request #1749 from martoche/many2many-multi-tenant-fix
fix many2many for multi-tenant applications (table names with a param)
2 parents c073c96 + ca8f1b1 commit 55b0ab7

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

db_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
func init() {
2525
orm.RegisterTable((*BookGenre)(nil))
26+
orm.RegisterTable((*IngredientRecipe)(nil))
2627
}
2728

2829
func TestGinkgo(t *testing.T) {
@@ -2429,3 +2430,75 @@ var _ = Describe("soft delete with int column", func() {
24292430
assert()
24302431
})
24312432
})
2433+
2434+
type Recipe struct {
2435+
tableName struct{} `pg:"?tenant.recipes"`
2436+
Id int
2437+
Ingredients []*Ingredient `pg:"many2many:?tenant.ingredients_recipes"`
2438+
}
2439+
2440+
type Ingredient struct {
2441+
tableName struct{} `pg:"?tenant.ingredients"`
2442+
Id int
2443+
Recipes []*Recipe `pg:"many2many:?tenant.ingredients_recipes"`
2444+
}
2445+
2446+
type IngredientRecipe struct {
2447+
tableName struct{} `pg:"?tenant.ingredients_recipes"`
2448+
Recipe *Recipe `pg:"rel:has-one"`
2449+
RecipeId int `pg:",pk"`
2450+
Ingredient *Ingredient `pg:"rel:has-one"`
2451+
IngredientId int `pg:",pk"`
2452+
}
2453+
2454+
var _ = Describe("many2many multi-tenant bug", func() {
2455+
var db *pg.DB
2456+
2457+
BeforeEach(func() {
2458+
db = testDB().WithParam("tenant", pg.Safe("public"))
2459+
options := orm.CreateTableOptions{}
2460+
2461+
err := db.Model((*Recipe)(nil)).CreateTable(&options)
2462+
Expect(err).NotTo(HaveOccurred())
2463+
2464+
err = db.Model((*Ingredient)(nil)).CreateTable(&options)
2465+
Expect(err).NotTo(HaveOccurred())
2466+
2467+
err = db.Model((*IngredientRecipe)(nil)).CreateTable(&options)
2468+
Expect(err).NotTo(HaveOccurred())
2469+
})
2470+
2471+
AfterEach(func() {
2472+
err := db.Model((*Recipe)(nil)).DropTable(nil)
2473+
Expect(err).NotTo(HaveOccurred())
2474+
2475+
err = db.Model((*Ingredient)(nil)).DropTable(nil)
2476+
Expect(err).NotTo(HaveOccurred())
2477+
2478+
err = db.Model((*IngredientRecipe)(nil)).DropTable(nil)
2479+
Expect(err).NotTo(HaveOccurred())
2480+
})
2481+
2482+
It("should find the many2many table", func() {
2483+
recipe := Recipe{Id: 1}
2484+
ingredient := Ingredient{Id: 1}
2485+
ingredientRecipe := IngredientRecipe{
2486+
RecipeId: 1,
2487+
IngredientId: 1,
2488+
}
2489+
2490+
_, err := db.Model(&recipe).Insert()
2491+
Expect(err).NotTo(HaveOccurred())
2492+
2493+
_, err = db.Model(&ingredient).Insert()
2494+
Expect(err).NotTo(HaveOccurred())
2495+
2496+
_, err = db.Model(&ingredientRecipe).Insert()
2497+
Expect(err).NotTo(HaveOccurred())
2498+
2499+
err = db.Model(&recipe).WherePK().Relation("Ingredients").Select()
2500+
Expect(err).NotTo(HaveOccurred())
2501+
Expect(recipe.Ingredients).To(HaveLen(1))
2502+
Expect(recipe.Ingredients[0].Id).To(Equal(1))
2503+
})
2504+
})

orm/table.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -807,7 +807,7 @@ func (t *Table) mustM2MRelation(field *Field, pgTag *tagparser.Tag) bool {
807807
if !ok {
808808
panic(fmt.Errorf("pg: %s must have many2many tag option", field.GoName))
809809
}
810-
m2mTableName := quoteIdent(m2mTableNameString)
810+
m2mTableName := quoteTableName(m2mTableNameString)
811811

812812
m2mTable := _tables.getByName(m2mTableName)
813813
if m2mTable == nil {

0 commit comments

Comments
 (0)