2012-07-17 3 views
1

스크립트에서 데이터베이스의 테이블에서 행을 삭제하려고합니다. 아마 이것은 쉬운 방법이 아니지만 그것이 가능해야한다고 생각합니다. 나는 다음과 같은 오류를 받고 있어요스크립트에서 db에 액세스 할 수 없습니다.

from stemewebapp import app 
from stemewebapp.models import Job, db 
import sys 

# 
# Check arguments 
# 
if len(sys.argv) != 2: 
    print 'USAGE: %s <job uuid>' % (sys.argv[0]) 
    sys.exit(-1) 
job_uuid = sys.argv[1] 

# 
# Do everything in context 
# 
with app.test_request_context(): 

    # 
    # Get job 
    # 
    query = db.session.query(Job).filter_by(uuid=job_uuid) 
    #query = Job.query.filter_by(uuid=job_uuid) 
    if 1 != query.count(): 
     raise RuntimeError('Got more than one job by UUID.') 

    # 
    # Delete from database 
    # 
    db.session.delete(query.first()) 
    db.session.commit() 

:

OperationalError: (OperationalError) no such table: job u'SELECT count(*) AS count_1 \nFROM (SELECT job.id AS job_id, job.creation_date AS job_creation_date, job.name AS job_name, job.uuid AS job_uuid, job.pid AS job_pid, job.completed AS job_completed \nFROM job \nWHERE job.uuid = ?) AS anon_1' ('743d952f-9cfc-4efc-bfa5-58da67c4a131',) 
+0

flask-sqlalchemy를 제거하기 위해 제목을 편집해야하는 이유는 무엇입니까? – John

답변

2

이 올바른 방법이 아니다 나는 다음을 시도하고있다.

Sqlalchemy는 쿼리 개체에 이름이 one 인 메서드를 제공합니다.

 try: 
     obj = db.session.query(Job).filter_by(uuid=job_uuuid).one() 
    except NoResultFound: 
     raise 
    except MultipleResultsFound: 
     raise RuntimeError('Got more than one job by UUID.') 
    else: 
     db.session.delete(obj) 
     db.session.commit() 

One()은 하나의 결과 만 가져오고 여러 결과가있는 경우 예외가 발생합니다.

오류는 테이블이 존재하지 않음을 나타냅니다. 잘못된 데이터베이스에 액세스하고 있는지 또는 데이터베이스를 초기화하지 않았는지 확인하십시오. 현재 정보는 당신을 도울만큼 충분하지 않습니다.

+0

하나의 방법에 대한 팁 주셔서 감사. 두 가지 방법 모두 효과가 있다고 생각합니다. – John

+0

아파치에서 실행될 때와 동일한 설정으로 플라스크를 구성해야한다는 것을 알았습니다. 포인터 주셔서 감사. 당신이 그것에 대해 생각할 때 분명하지만 왜 그것이 처음에는 데이터베이스를 찾을 수 없다고 불평하지 않았습니까? – John

+0

@ 존 당신은 query.count()를 사용하면 안됩니다. 첫 번째로 count 쿼리를 실행 한 다음 실제로 다른 쿼리를 실행하여 객체에 실제로 액세스하는 반면 간단한 query.one()은 단일의보다 효율적인 쿼리로 수행합니다. 또한 예외를 사용하면 코드가 읽기 쉽고 유지 보수가 쉽습니다! – codecool