在 2016年8月31日星期三 UTC+8下午9:56:29,Mike Bayer写道:
>
>
>
> On 08/30/2016 10:52 PM, [email protected] <javascript:> wrote:
> > I am using PostgreSQL and Alembic for migration. When I added new column
> > to my User table Alembic generated migration with the following script:
> >
> > from alembic import op
> > import sqlalchemy as sa
> > import random
> >
> > def generate_toke():
> > return random.random()
> >
> > def upgrade():
> > op.add_column('user', sa.Column('token', sa.String(), nullable=True
> ))
> > op.execute('some code here')
> >
> > What I actually want to do is autogenerating the value of token by the
> > generate_toke function for existing data in my DB.
> >
> > Is there a solution?
>
> Because this is a Python function, simplest way to run the actual
> function (which might not be necessary, see below), run an update()
> statement in a loop:
>
>
> from sqlalchemy import Table, MetaData, select
>
> # make a local Table object
> user_table = Table(
> 'user', MetaData(),
>
> # whatever the primary key is goes here, for example "user_id"
> Column('user_id', Integer, primary_key=True),
>
> # then your token column
> Column('token', String())
> )
>
> connection = op.get_bind()
> for row in connection.execute(select([user_table.c.user_id])):
> connection.execute(
> user_table.update().
> values(token=generate_token()).
> where(user_table.c.id == row['user_id'])
> )
>
> now, if the function is truly the "random()" function, good news.
> Postgresql has that already. So instead of all the above, just do:
>
>
> op.execute("update user set token=random()")
>
>
>
> >
> >
> > Alembic`s onwer Michael Bayer redirect me there
> >
> >
> https://bitbucket.org/zzzeek/alembic/issues/383/set-the-value-of-column-when-upgrading
>
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "sqlalchemy-alembic" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> > an email to [email protected]
> <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > For more options, visit https://groups.google.com/d/optout.
>
thanks for your great help!
and my solution is below:
connection = op.get_bind()
for user in connection.execute('select user_id from user'):
token = random_token()
connection.execute("update user set token = '%s' where user_id =
%d"%(token, user[0])
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy-alembic" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.