【问题标题】:How to update a record in SQLAlchemy Alembic migration?如何更新 SQLAlchemy Alembic 迁移中的记录?
【发布时间】:2017-09-07 15:16:18
【问题描述】:

我正在为我的 SQLAlchemy 应用程序编写数据库迁移脚本。 下面的迁移有效。但它实际上并没有做任何事情(还没有!):

 1: from alembic import op
 2: import sqlalchemy as sa
 3: 
 4: def upgrade():
 5:     my_table = sa.Table('my_table',
 6:                           sa.MetaData(),
 7:                           sa.Column('my_id', sa.Integer, primary_key=True),
 8:                           sa.Column('my_attribute1', sa.Text(), nullable=True),
 9:                           sa.Column('my_attribute2', sa.String(length=128), nullable=True))
10:
11:
12: connection = op.get_bind()
13: for my_record in connection.execute(my_table.select()):
14:     x = my_record.my_id
15:     print x

我想修改上面的迁移来做以下事情但我不知道怎么做:

  • 在第 #13 行中,我只想选择 my_attribute1 == 'Hello' 的那些记录
  • 在第 15 行,我不想执行打印语句,而是更新 my_record,使 my_attribute2 设置为 my_attribute1[:10] + 'Goodbye'

我该怎么做?当我尝试使用 where 子句进行选择和更新时,它们不起作用。 manual 没有多大帮助。

【问题讨论】:

  • 那里出现了一些缩进问题。 for 循环不是升级功能的一部分。请包含您在问题中尝试的 where 子句的选择和更新。您应该阅读SQL Expression Language Tutorial,而不是 DML 手册。
  • 另外,请描述它们如何以及为什么不起作用。你有例外吗?如果是这样,请包括回溯。升级是否运行,但没有保存任何更改?

标签: python mysql sqlalchemy database-migration alembic


【解决方案1】:

在迁移中绕过 ORM 并执行类似的操作会更安全

connection = op.get_bind()
connection.execute("UPDATE my_table SET my_attribute2 = SUBSTRING(my_attribute1, 0, 10) + 'Goodbye' WHERE my_attribute1 = 'Hello'")

我假设这只是一个示例,您将做一些不同的事情,因为否则,您不需要获取 my_attribute1 的子字符串,因为它对于这些记录始终具有相同的值 'Hello'。

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 2018-09-09
    • 2013-06-16
    • 1970-01-01
    • 2016-09-06
    • 2017-08-26
    • 2018-07-08
    • 2018-06-29
    • 2020-02-17
    相关资源
    最近更新 更多