2017-04-12 2 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 대신 인쇄 문을 수행에서 my_attribute1 == 'Hello'
  • , 나는 my_attribute2my_attribute1[:10] + 'Goodbye'
로 설정되어 my_record 있도록 업데이트 할 레코드 만 선택합니다

어떻게해야합니까? 내가 어디에서 절을 선택하여 & 업데이트를 시도했지만 작동하지 않았습니다. manual은 별 도움이되지 않았습니다.

+0

들여 쓰기 문제가 있습니다. for-loop는 업그레이드 기능의 일부가 아닙니다. 질문에서 시도한 절과 함께 선택 및 업데이트를 포함하십시오. DML 매뉴얼 대신 [SQL Expression Language Tutorial] (http://docs.sqlalchemy.org/en/latest/core/tutorial.html#inserts-updates-and-deletes)를 읽어야합니다. –

+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의 하위 문자열을 가져올 필요가 없습니다.

관련 문제