Я использую PostgreSQL и Alembic для миграции. Когда я добавил новый столбец в свою таблицу User, Alembic сгенерировал миграцию с помощью следующего скрипта:
revision = '4824acf75bf3'
down_revision = '2f0fbdd56de1'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column(
'user',
sa.Column(
'username',
sa.Unicode(length=255),
nullable=False
)
)
def downgrade():
op.drop_column('user', 'username')
На самом деле я хочу автоматически генерировать значение имени пользователя при обновлении производственной версии. Другими словами, в моей производственной версии много пользователей, и если я запустил на ней вышеуказанное обновление, возникнет ошибка, указывающая, что имя пользователя не может быть NULL, поэтому мне нужно удалить всех пользователей, обновить таблицу User и после добавления пользователей снова, что болезненно. Таким образом, я хочу изменить приведенный выше сценарий на:
revision = '4824acf75bf3'
down_revision = '2f0fbdd56de1'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column(
'user',
sa.Column(
'username',
sa.Unicode(length=255)
)
)
op.execute(
'UPDATE "user" set username = <email address with no '@'
and everything comes after '@' sign should be removed>
WHERE email is not null'
)
<only after the above code is executed 'nullable=False' must be set up>
def downgrade():
op.drop_column('user', 'username')
Как указано выше в коде, я хотел бы выполнить код SQL, который проверяет адрес электронной почты, например [email protected], и выдает все после знака '@' (в данном случае '@ example.com') и устанавливает значение имени пользователя (в данном случае «test») после этого делает значение nullable = false.
Как я могу это сделать? Какой должен быть скрипт вместо username = <email address with no '@' and everything comes after '@' sign should be removed>
и установка nullable=false
Или есть другой способ установить значение username
по умолчанию, чтобы он был адресом электронной почты без @ sing и всего, что после него?