2017-04-12 33 views
0

私はSQLAlchemyアプリケーション用のデータベース移行スクリプトを作成しています。 以下の移行が機能します。SQLAlchemy Alembicの移行でレコードを更新するには?

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で私はライン#15の代わりにprint文を実行するにはmy_attribute1 == 'Hello'
  • が、私はmy_attribute2my_attribute1[:10] + 'Goodbye'
に設定されている my_recordように更新するレコードだけを選択したいです

どうすればいいですか? where句で更新を選択しようとしたところ、動作しませんでした。 manualはあまり役に立たなかった。

+0

ここではインデントの問題が発生しています。 forループは、アップグレード機能の一部ではありません。あなたの質問で試した句には、選択と更新を含めてください。 DMLマニュアルの代わりに[SQL Expression Language Tutorial](http://docs.sqlalchemy.org/en/latest/core/tutorial.html#inserts-updates-anddelees)を読んでください。 –

+0

また、どのように動作しなかったのか説明してください。例外はありましたか?その場合は、トレースバックを含めます。アップグレードは実行されましたが、変更は保存されませんでしたか? –

答えて

2

あなたが原因そうでない場合は、移行にORMをバイパスし、ただ、これはあくまでも一例であり、あなたは少し違う何かをやろうとしている私が想定し

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

ような何かをすることは、より安全になり、あなたそれらのレコードには常に同じ値の 'Hello'があるので、my_attribute1の部分文字列を取る必要はありません。

関連する問題