2016-09-22 4 views
0

SQLAlchemy (1.1.0b3) 및 Postgres를 사용하여 Flask 응용 프로그램을 실행 중입니다.일시적으로 SQLAlchemy의 증가를 비활성화하십시오.

Flask를 사용하면 클라이언트가 유형 데이터베이스의 모든 인스턴스를 가져 와서 Flask 응용 프로그램의 깨끗한 버전에서 다시 로컬 클라이언트로 가져올 수있는 API를 제공합니다. 클라이언트가 다시 게시하면 다시 다운로드 할 때와 동일한 ID를 가져야합니다.

정상적인 작동을 위해 기본 키에 대한 "증가"옵션을 사용하지 않으려 고하지만 클라이언트가 POST로 ID를 제공하고 새 자원에 ID를 제공하고자한다면이를 깨지 않고 적절히 설정하려고합니다 SQLAlchemy. 현재 ID의 최대 값에 액세스하거나 재설정하려면 어떻게합니까?

@app.route('/objects', methods = ['POST']) 
def post_object(): 

    if 'id' in request.json and MyObject.query.get(request.json['id']) is None: #1 
     object = MyObject() 
     object.id = request.json['id'] 
    else: #2 
     object = MyObject() 

    object.fillFromJson(request.json) 
    db.session.add(object) 
    db.session.commit() 
    return jsonify(object.toDict()),201 

의 ID #1와 함께 개체의 무리를 추가하고 다음 ID없이 또는 사용 ID #2로에 추가하려고, 내가 얻을.

duplicate key value violates unique constraint "object_pkey" 
DETAIL: Key (id)=(2) already exists. 

일반적으로 ID는 incrementally을 생성하지만 ID가 이미 사용하는 경우, 그에 대한 확인이 없습니다. 자동 증가와 INSERT 사이에 어떻게 갈 수 있습니까?

+1

어떤 문제가 있습니까? Postgres를 사용하면 삽입하는 동안 기본 키 값을 설정할 수 있습니다. – dirn

+0

'session.add (object)'처럼 보입니다.'object'는 id가 없으므로 id가없는'session.add (object)'가 마지막으로 호출 된 시간보다 더 큰 객체에 id를 제공합니다. –

+0

하지만 ID를 사용하고 싶다면 세션에 추가하기 전에 객체에 할당하지 않는 이유는 무엇입니까? – dirn

답변

0

고정 ID가있는 개체를 추가 한 후에는 정상적인 증분 동작으로 인해 향후 삽입시 충돌이 발생하지 않아야합니다.

내가 생각할 수있는 가능한 해결책은 다음 삽입 ID를 표에있는 최대 ID (+1)로 설정하는 것입니다. 당신은 당신의 코드에 다음과 같은 추가와 함께이 작업을 수행 할 수 있습니다 테이블에 삽입

@app.route('/objects', methods = ['POST']) 
def post_object(): 
    fixed_id = False 
    if 'id' in request.json and MyObject.query.get(request.json['id']) is None: #1 
     object = MyObject() 
     object.id = request.json['id'] 
     fixed_id = True 
    else: #2 
     object = MyObject() 

    object.fillFromJson(request.json) 
    db.session.add(object) 
    db.session.commit() 

    if fixed_id: 
     table_name = MyObject.__table__.name 
     db.engine.execute("SELECT pg_catalog.setval(pg_get_serial_sequence('%s', 'id'), MAX(id)) FROM %s;" % (table_name, table_name)) 

    return jsonify(object.toDict()),201 

(고정 ID 없음) 다음 개체는 테이블에서 발견 된 가장 큰 ID의 ID 증가를 계속합니다.