pg
pg copied to clipboard
Has one query not forming correctly
I'm having trouble getting a has one relationship to work. I followed the wiki's examples and have been trying this for hours.
I know the table names and fields are really weird with plural and underscores, but I've inherited this database and can't change it currently.
type Subscription struct {
tableName struct{} `pg:"\"Subscriptions\",discard_unknown_columns"`
ID string `pg:"_id,pk,type:uuid"`
Status string `pg:"status"`
...
AddressID string `pg:"address__id"`
Address *Address `pg:"fk:address__id" json:"Address"`
}
type Address struct {
tableName struct{} `pg:"\"Addresses\",discard_unknown_columns"`
ID string `pg:"_id,pk,type:uuid"`
Line1 string `pg:"line1,notnull"`
Line2 *string `pg:"line2"`
City string `pg:"city,notnull"`
State string `pg:"state,notnull"`
ZipCode string `pg:"zipCode,notnull"`
Longitude float64 `pg:"longitude"`
Latitude float64 `pg:"latitude"`
CreatedAt time.Time `pg:"created_at,notnull"`
UpdatedAt time.Time `pg:"updated_at,notnull"`
}
func (c *Client) Get(id string) (*Subscription, error) {
sub := &Subscription{}
q := c.db.Model(sub)
// q = q.Relation("Addresses") This doesn't work for some reason. Gives relationship not found error. But Address does use Addresses in the query.
q = q.Relation("Address")
err := q.Where(`"subscription"."_id" = ?`, id).Select()
if err != nil {
return nil, err
}
return sub, nil
}
This results in
SELECT "subscription"."_id", "subscription"."status", "subscription"."created_at", "subscription"."updated_at", "subscription"."user__id", "subscription"."address__id", "subscription"."deleted_at", "address"."_id" AS "address___id", "address"."line1" AS "address__line1", "address"."line2" AS "address__line2", "address"."city" AS "address__city", "address"."state" AS "address__state", "address"."zipCode" AS "address__zipCode", "address"."longitude" AS "address__longitude", "address"."latitude" AS "address__latitude", "address"."created_at" AS "address__created_at", "address"."updated_at" AS "address__updated_at" FROM "Subscriptions" AS "subscription" LEFT JOIN "Addresses" AS "address" ON "address"."_id" = "subscription"."_id" WHERE ("subscription"."_id" = '01bc61cb-60f9-41f3-96bf-dd92589efe14')
{
"ID": "01bc61cb-60f9-41f3-96bf-dd92589efe14",
"Status": "active",
"AddressID": "",
"Address": {
"ID": "",
"Line1": "",
"Line2": null,
"City": "",
"State": "",
"ZipCode": "",
"Longitude": 0,
"Latitude": 0,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z"
}
}
AddressID is empty even though it isn't in the database
The resulting query is incorrect. I get LEFT JOIN "Addresses" AS "address" ON "address"."_id" = "subscription"."_id
But i would expect LEFT JOIN "Addresses" AS "address" ON "address"."_id" = "subscription"."address__id
.
Could you explain what i have setup incorrectly if it's incorrect?