2017-04-12 57 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我要選擇僅在my_attribute1 == 'Hello'
  • 在線#15,而不是進行打印語句,我想更新my_record這樣my_attribute2設置爲my_attribute1[:10] + 'Goodbye'
那些記錄

我該怎麼辦?當我試圖用where子句選擇&更新時,它們不起作用。 manual沒有太大的幫助。

+0

你有一些縮進問題。 for循環不是升級功能的一部分。請包括您在問題中嘗試使用where子句的選擇和更新。您應該閱讀[SQL表達式語言教程](http://docs.sqlalchemy.org/en/latest/core/tutorial.html#inserts-updates-and-deletes),而不是DML手冊。 –

+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'") 

我認爲這只是一個例子,你要做的東西有點不同,因爲否則的話,你不需要使用my_attribute1的子字符串,因爲它對這些記錄始終具有相同的值「Hello」。