Andrew Pashkin <apash...@mirantis.com> wrote:

> Mike Bayer wrote:
>> The patch seems to hardcode the conventions for MySQL and Postgresql.
>> The first thought I had was that in order to remove the dependence
>> on them here, you’d need to instead simply turn off the
>> “naming_convention” in the MetaData if you detect that you’re on one
>> of those two databases. That would be a safer idea than trying to
>> hardcode these conventions (and would also work for other kinds
>> of backends).
> With your solution it is still will be necessary for developers
> to guess constraints names when writing new migrations. And it will
> be even harder, because they will need also to handle case of
> "naming conventions”.

there’s always a naming convention in place; all databases other than SQLite 
produce them on the fly if you don’t specify one.  The purpose of the 
Alembic/SQLAlchemy naming_convention feature is so that you have *one* naming 
convention, rather than N unpredictable conventions.   I’m not sure if you’re 
arguing the feature should not be used.  IMHO it should definitely be used for 
an application that is deploying cross-database.  Otherwise you have no choice 
but to hardcode the naming conventions of each target database individually in 
all cases that you need to refer to them.




> 
> Mike Bayer wrote:
>> However, it’s probably worthwhile to introduce a migration that does
>> in fact rename existing constraints on MySQL and Postgresql.
> Yes, that's what I want to do in case of the first solution.
> 
> Mike Bayer wrote:
>>> Another possible solution is to drop all current migrations and
>>> introduce new one with correct names.
>> you definitely shouldn’t need to do that.
> Why?
> 
> On 30.01.2015 22:00, Mike Bayer wrote:
>> Andrew Pashkin <apash...@mirantis.com> wrote:
>> 
>>> Working on this issue I encountered another problem.
>>> 
>>> Most indices in the project has no names and because of that,
>>> developer must reverse-engineer them in every migration.
>>> Read about that also here [1].
>>> 
>>> SQLAlchemy and Alembic provide feature for generation constraint
>>> names by pattern, specifically to resolve that kind of issues [1].
>>> 
>>> I decided to introduce usage of this feature in Murano.
>>> 
>>> I've implemented solution that preserves backward-compatibility
>>> for migration and allows to rename all constraints according
>>> to patterns safely [2]. With it user, that have already deployed Murano
>>> will be able to upgrade to new version of Murano without issues.
>>> 
>>> There are downsides in this solution:
>>> - It assumes that all versions of Postgres and MySQL uses the
>>> same patterns for constraints names generation.
>>> - It is hard to implement a test for this solution and it will be slow.
>>> Because there is need to reproduce such situation when user has old
>>> versions of migrations applied, and then tries to upgrade.
>> 
>> The patch seems to hardcode the conventions for MySQL and Postgresql.   The 
>> first thought I had was that in order to remove the dependence on them here, 
>> you’d need to instead simply turn off the “naming_convention” in the 
>> MetaData if you detect that you’re on one of those two databases.   That 
>> would be a safer idea than trying to hardcode these conventions (and would 
>> also work for other kinds of backends).
>> 
>> However, I’m not actually sure that you even need special behavior for these 
>> two backends.  If an operator runs these migrations on a clean database, 
>> then the constraints are generated with the consistent names on all 
>> backends.   if a target database already has these schema constructs 
>> present, then these migrations are never run; it doesn’t matter that they 
>> have the right or wrong names already.
>> 
>> I suppose then that the fear is that some PG/MySQL databases will have 
>> constraints that are named in one convention, and others will have 
>> constraints using the native conventions.    However, the case now is that 
>> all deployments are using native conventions, and being able to DROP these 
>> constraints is already not very feasible unless you again were willing to 
>> hardcode those naming conventions up forward.    The constraints in these 
>> initial migrations, assuming you don’t regenerate them, might just need to 
>> be left alone, and the project proceeds in the future with a consistent 
>> convention.
>> 
>> However, it’s probably worthwhile to introduce a migration that does in fact 
>> rename existing constraints on MySQL and Postgresql.  This would be a 
>> migration script that emits DROP CONSTRAINT and CREATE CONSTRAINT for all 
>> the above constraints that have an old name and a new name.  The script 
>> would need to check the backend, as you’re doing now, in order to run, and 
>> yes it would hardcode the names of those conventions, but at least it would 
>> just be a one-time run against only currently deployed databases.   Since 
>> your migrations are run “live”, the script can make itself a “conditional” 
>> run by checking for the “old” names and skipping those that don’t exist.     
>>  
>> 
>>> Another possible solution is to drop all current migrations and
>>> introduce new one with correct names.
>> 
>> you definitely shouldn’t need to do that.
>> 
>> 
>>> This brings us to new problem - migrations and models are out of sync
>>> right now in multiple places - there are different field types in
>>> migrations and models, migrations introduces indices that is absent
>>> in models, etc.
>>> 
>>> And this solution has great downside - it is not backward-compatible,
>>> so all old users will lost their data.
>>> 
>>> We (Murano team) should decide, what solution we want to use.
>>> 
>>> 
>>> [1]
>>> http://alembic.readthedocs.org/en/latest/naming.html#tutorial-constraint-names
>>> [2] https://review.openstack.org/150818
>>> 
>>> -- 
>>> With kind regards, Andrew Pashkin.
>>> cell phone - +7 (985) 898 57 59
>>> Skype - waves_in_fluids
>>> e-mail - apash...@mirantis.com
>>> 
>>> __________________________________________________________________________
>>> OpenStack Development Mailing List (not for usage questions)
>>> Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
>>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
>> 
>> __________________________________________________________________________
>> OpenStack Development Mailing List (not for usage questions)
>> Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
>> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev
> 
> -- 
> With kind regards, Andrew Pashkin.
> cell phone - +7 (985) 898 57 59
> Skype - waves_in_fluids
> e-mail - apash...@mirantis.com
> 
> __________________________________________________________________________
> OpenStack Development Mailing List (not for usage questions)
> Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to