2012-05-01 7 views
3

私はSQLAlchemy + Pyramidを使用してデータベースを操作しています。ただし、DB内に常に存在するとは限らないオプションのテーブルがあります。だから、それらを照会しながら、私はNoSuchTableError存在しないオプションテーブルのチェック

try: 
    x = session.query(ABC.name.label('sig_name'),func.count('*').label('count_')).join(DEF).join(MNO).filter(MNO.relevance >= relevance_threshold).group_by(DEF.signature).order_by(desc('count_')).all()[:val] 
except NoSuchTableError: 
    x = [-1,] 

でこのようなケースをキャッチしようとする。しかし、この文を実行する上で、私はなぜSQLAlchemyのがより一般的なProgrammingErrorを上げない代わりに、より具体的なProgrammingError

ProgrammingError: (ProgrammingError) (1146, "Table 'db.mno' doesn't exist") 

を取得NoSuchTableError?これが実際に予想される動作である場合、テーブルが存在するかどうかに応じてアプリが正しい情報を表示するようにするにはどうすればよいですか?

EDIT1

これは私のWebアプリケーションの一部であるので、DBのモデルは、(私のピラミッドのWebアプリケーションの下)models.pyです。 .iniファイルに、ユーザーが追加のテーブルを使用できるかどうかを選択する設定があります。しかし、ユーザーを信頼していないので、テーブルが存在するかどうかを自分で確認することができます。論争の表は、テーブルが存在しているかどうか私に語っ

変数を設定することができるようにチェックがなされるべきである
class MNO(Base): 
    __tablename__="mno" 
    id=Column(Integer,primary_key=True,autoincrement=True) 
    sid=Column(Integer) 
    cid=Column(mysql.MSInteger(unsigned=True)) 
    affectability=Column(Integer) 
    cvss_base=Column(Float) 
    relevance=Column(Float) 
    __table_args__=(ForeignKeyConstraint(['sid','cid',],['def.sid','def.cid',]),UniqueConstraint('sid','cid'),) 

どのようにして(好ましくはアプリのセットアップ中)(models.py中)のようなものでしょうか?

注:この場合、私があれば試してみなければなりません...他に「SQLAlchemyの[ある]はロードするように求められたときにNoSuchTableErrorのみがスローされ、sqlalchemyドキュメントによると

+0

は、あなたの新しい質問に対処しようとする私の答えに別の部分を追加しました。 –

答えて

6

を「許しを求める」のではなく、データベースからのテーブルの定義ですが、テーブルは存在しません。テーブルの定義をロードし、そこにエラーをキャッチし、そうでなければクエリを実行してみることができます。

はあなたが "許しを求めて" を介して物事をしたい場合:

try: 
    table = Table(table_name, MetaData(engine)) 
except NoSuchTableError: 
    pass 

また、あなただけのテーブルが存在するかどうかをチェックすることができ:

編集:いっそ

has_table methodを使用してください:

if engine.dialect.has_table(connection, table_name): 
    #do your crazy query 

Inspectorを使用して最初にテーブル名を取得しないのはなぜですか?

はたぶん、このような何か:

from sqlalchemy import create_engine 
from sqlalchemy.engine import reflection 
#whatever code you already have 
engine = create_engine('...') 
insp = reflection.Inspector.from_engine(engine) 
table_name = 'foo' 
table_names = insp.get_table_names() 
if table_name in table_names: 
    x = session.query(ABC.name.label('sig_name'),func.count('*').label('count_')).join(DEF).join(MNO).filter(MNO.relevance >= relevance_threshold).group_by(DEF.signature).order_by(desc('count_')).all()[:val] 
+0

私はPythonのレキシコン[EAFP](http://docs.python.org/glossary.html#term-eafp);)に忠実にしようとしていました....これらのどれかを試してみます – RedBaron

+0

@ RedBaron私のようなものちょうど編集された? –

+0

問題の背景を提示するために私の質問を編集しました – RedBaron

関連する問題