2012-07-17 94 views
1

我想从脚本中的数据库中的表中删除一行。也许这不是最简单的方法,但我认为它应该是可能的。我想下面:无法从脚本访问数据库

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 2012-07-17 13:20:03

回答

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 2012-07-17 13:18:06

+0

刚刚发现我需要配置与在Apache中运行时相同的设置。感谢指针。当你想到它时显而易见,但为什么它没有抱怨它首先找不到数据库? – John 2012-07-17 13:18:57

+0

@John你不应该使用query.count()。您首先发出计数查询,然后再发出另一个查询以实际访问对象,而简单的query.one()将使用单个更有效的查询。此外使用异常代码更具可读性和可维护性! – codecool 2012-07-17 13:26:23