You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The migration file is created successfully, but the migration itself ends with the error: asyncpg.exceptions.DuplicateTableError: relation "employee_role" already exists
It turns out that piccolo generates the following SQL: CREATE INDEX employee_role ON "employee" USING btree ("role");
And this clashes with the name of the table.
@classmethoddef_get_index_name(cls, column_names: t.List[str]) ->str:
""" Generates an index name from the table name and column names. """return"_".join([cls._meta.tablename] +column_names)
To prevent that kind of name conflicts, can we add the suffix to the index name, like _idx_XXXX there X is the random hex symbol?
UPD: however, in order to be able to gracefully undo the migration backwards the migration file must store the index name somethere or look it up from the database.
The text was updated successfully, but these errors were encountered:
I think we should probably add an index_name argument for situations like this.
The downside is migrations would have to be aware of this, and if the user changes index_name we need to change it in the database. It's not too complex though:
importrandomfrompiccolo.tableimportTable@classmethoddef_get_index_name(cls, column_names: list[str]) ->str:
""" Generates a semi-unique index name from the table name and column names. """hex_range=range(16)
random_symbols=''.join([f'{random.choice(hex_range):01x}'foriinrange(4)])
return'_'.join([cls._meta.tablename] +column_names+ ['idx', random_symbols])
Table._get_index_name=_get_index_name
However, in this case you will not be able to correctly undo the migration and will have to delete the index manually if necessary.
OR just add "idx" part and forget about randomness, maybe.
So I have this two tables in postgres:
The migration file is created successfully, but the migration itself ends with the error:
asyncpg.exceptions.DuplicateTableError: relation "employee_role" already exists
It turns out that piccolo generates the following SQL:
CREATE INDEX employee_role ON "employee" USING btree ("role");
And this clashes with the name of the table.
The code for index name lives here:
To prevent that kind of name conflicts, can we add the suffix to the index name, like
_idx_XXXX
there X is the random hex symbol?UPD: however, in order to be able to gracefully undo the migration backwards the migration file must store the index name somethere or look it up from the database.
The text was updated successfully, but these errors were encountered: