2013-03-21 1 views
2

나는 데이터베이스 구조를 관리하는 데 alembic를 사용하고 있습니다.alembic 및 마지막 삽입 값 가져 오기

ID를 Integer 및 기본 키로 사용하여 테이블을 추가 한 후 id 열은 자동 증가 열입니다. 업그레이드 스크립트의 데이터를 쿼리하여 정확한 ID를 얻을 수 있도록하는 방법 (이 특정 사례에서 1이라는 것을 알고 있습니다)?

나는 내가 갱신 할 수있는 방법을 알고

#creating the table 
op.create_table(
    'srv_feed_return_type', 
    sa.Column('id', sa.Integer, primary_key=True), 
    sa.Column('name', sa.String(50), nullable=False), 
    sa.Column('created', sa.DateTime, server_default=func.now(), nullable=False), 
    sa.Column('created_by', sa.String(50), nullable=False), 
    sa.Column('last_updated', sa.DateTime, nullable=False), 
    sa.Column('last_updated_by', sa.String(50), nullable=False) 
) 

#table for operations 
srv_feed_return_type = table('srv_feed_return_type', 
          column('name'), 
          column('created'), 
          column('created_by'), 
          column('last_updated'), 
          column('last_updated_by')) 

#bulk insert 
op.bulk_insert(srv_feed_return_type, 
       [ 
        {'name': 'dataset', 
        'created': datetime.now(), 'created_by': 'Asken', 
        'last_updated': datetime.now(), 'last_updated_by': 'Asken'} 
       ]) 

알고 있지만 나는 다음과 같은 유사한 선택하여 일을 어떻게해야합니까?

op.execute(
    srv_feed_return_type.update().\ 
     where(srv_feed_return_type.c.name==op.inline_literal('dataset')).\ 
     values({'name':op.inline_literal('somethingelse')}) 
     ) 
+0

를 하드 코딩했다가 마이그레이션이 완료 될 때까지 새로 만든 테이블을 수정하는 다른 프로세스가 없을 것이라고 가정하는 것이 안전합니까? 이 예에 대해서는 – vvladymyrov

+0

예.하지만 여기에 하나가 될 것입니다. 다른 마이그레이션에서는 더 이상 1이 아닙니다. 나는 특정 반환 유형의 ID를 알아야합니다. – Asken

+0

귀하의 앱에 어떤 데이터베이스를 사용하고 있으며 다른 데이터베이스에 더 많은 가능성이 있습니다 - 애플리케이션을 데이터베이스에 의존 할 필요가 있습니까? – vvladymyrov

답변

4

자동 증가 컬럼을 가지고 먼저이 테이블 스키마 정의를 수정해야이 시퀀스는 기본 키 컬럼에 통과하기 : sa.Column('id', sa.Integer, Sequence('srv_feed_r_t_seq'),primary_key=True),

#creating the table 
op.create_table(
    'srv_feed_return_type', 
    sa.Column('id', sa.Integer, Sequence('srv_feed_r_t_seq'),primary_key=True), 
    sa.Column('name', sa.String(50), nullable=False), 
    sa.Column('created', sa.DateTime, server_default=func.now(), nullable=False), 
    sa.Column('created_by', sa.String(50), nullable=False), 
    sa.Column('last_updated', sa.DateTime, nullable=False), 
    sa.Column('last_updated_by', sa.String(50), nullable=False) 
) 

을 지금 PK ID를 얻는 방법에 대해 :

op.executeop.bulk_insert는 결과를 반환하지 않습니다. 그러나 이러한 작업에 동일한 연결을 사용할 수 있습니다.

bulk_insert 또는 execute(table.update ...)을 수행 한 후에는 같은 맥락에서 선택 쿼리를 실행할 수 있습니다 관심있는 레코드 PK ID를 검색 :

connection = op.get_bind() 
r = connection.execute(srv_feed_return_type.select().where(...)) 
for row in r: 
    pk_id = r['id'] 
    """or something more sophisticated""" 

당신은 절 있는지 확인하는 곳에서 적절한 필터를 지정해야합니다 당신은 당신이 최근에 독특한 방식으로 바꾼 기록을 발견했습니다. 여기

some example of similar functionality이지만, 선택 쿼리

+4

시도합니다. 감사! Btw, Integer 및 primary_key = True로 정의하면 자동으로 자동 증가합니다. – Asken

+0

자동 자동 증가에 대한 힌트를 제공해 주셔서 감사합니다. 오라클을 사용할 때 그것은 저에게 효과가 없었습니다. 따라서 시퀀스를 명시 적으로 사용해야했습니다. – vvladymyrov

+0

아마도 오라클과 다를 수 있습니다. 어쩌면 코드를 안전하게 작성하여 코드에 추가해야 안전합니다. – Asken