Set the value of column when upgrading table with alembic

4,122 views
Skip to first unread message

bin604...@gmail.com

unread,
Aug 30, 2016, 10:52:59 PM8/30/16
to sqlalchemy-alembic

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?


Alembic`s onwer Michael Bayer redirect me there

https://bitbucket.org/zzzeek/alembic/issues/383/set-the-value-of-column-when-upgrading

Mike Bayer

unread,
Aug 31, 2016, 9:56:29 AM8/31/16
to sqlalchem...@googlegroups.com


On 08/30/2016 10:52 PM, bin604...@gmail.com 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 sqlalchemy-alem...@googlegroups.com
> <mailto:sqlalchemy-alem...@googlegroups.com>.
> For more options, visit https://groups.google.com/d/optout.

bin604...@gmail.com

unread,
Aug 31, 2016, 11:27:54 PM8/31/16
to sqlalchemy-alembic


在 2016年8月31日星期三 UTC+8下午9:56:29,Mike Bayer写道:
> 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])

Reply all
Reply to author
Forward
0 new messages