2011-07-23 18 views
4

私はSQLAlchemyを使い始めています。私は疑問に思っています...私は自分のモデルにたくさんのテーブルを持っています。私は私のモデルで持っている各テーブルのための自分のファイルを持っていたいと思います。 に続いmeta.pySQLAlchemy - テーブルテンプレートを作成

from sqlalchemy import MetaData 
from sqlalchemy.orm import scoped_session, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.dialects import postgresql 
import sqlalchemy as sa 

__all__ = ['Session', 'engine', 'metadata'] 

# SQLAlchemy database engine. Updated by model.init_model() 
engine = None 

# SQLAlchemy session manager. Updated by model.init_model() 
Session = scoped_session(sessionmaker()) 

# Global metadata. If you have multiple databases with overlapping table 
# names, you'll need a metadata for each database 
metadata = MetaData() 

# declarative table definitions 
Base = declarative_base() 
Base.metadata = metadata 

schema = 'srbam_dev' 

_

"""The application's model objects""" 
import sqlalchemy as sa 
from sqlalchemy import orm 

from models import meta 
from models.filers import Filer 
from models.vfilers import Vfiler 
from models.filer_options import FilerOption 

def init_models(engine): 
    """Call me before using any of the tables or classes in the model""" 
    ## Reflected tables must be defined and mapped here 
    #global reflected_table 
    #reflected_table = sa.Table("Reflected", meta.metadata, autoload=True, 
    #       autoload_with=engine) 
    #orm.mapper(Reflected, reflected_table) 
    # 
    meta.engine = sa.create_engine(engine) 
    meta.Session.configure(bind=meta.engine) 

    class Basic_Table(object): 
     id = sa.Column(
      postgresql.UUID(), 
      nullable=False, 
      primary_key=True 
      ) 
     created = sa.Column(
      sa.types.DateTime(True), 
      nullable=False 
      ) 
     modified = sa.Column(
      sa.types.DateTime(True), 
      nullable=False 
      ) 

_.py initと、その後のすべてにおいて、以下:

私は現在、次のコードを使用しています私のモデル

from models.meta import Base 
from models.meta import Basic_Table 
from models.meta import schema 
import sqlalchemy as sa 
from sqlalchemy.dialects import postgresql 

class Filer(Base,Basic_Table): 

これは、だけで正常に動作していれば、私は外部キーが

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 't_vfilers.filer_id' could not find table 't_filers' with which to generate a foreign key to target column 'id' 

を言う使用したら、私は、テーブルの上にいくつかの外部キーを使用して起動しないように私は(ファイラークラスで直接IDキーを定義しようとしましたが、宣言からBasic_Tableを削除します)、これでは問題は解決しません。

データベースを作成するための私のコードは、モデルからsqlalchemy.engine.urlインポートURL からこの #!は/ usr/binに/ Pythonのような 輸入のConfigParser に見えるが*

config = ConfigParser.RawConfigParser() 
config.read('conf/core.conf') 
db_url = URL(
    'postgresql+psycopg2', 
    config.get('database','username'), 
    config.get('database','password'), 
    config.get('database','host'), 
    config.get('database','port'), 
    config.get('database','dbname') 
    ) 

init_models(db_url) 
meta.Base.metadata.drop_all(bind=meta.engine) 
meta.Base.metadata.create_all(bind=meta.engine) 

をインポートする誰もが持っていますどのようにこの問題を解決するアイデア?

+0

例外はどこに発生しますか? – driax

+0

ForeignKey制約の定義方法を確認できますか? また、このコードはすべて1つのファイルに含まれていれば動作しますか? (コースの適切な変更を伴う)? – driax

+0

エラーは、__Table__が__Column__ではなく見つからないことを示しているようです。ここでは推測していますが、__Filer__をモジュールにインポートしてFKを定義し、エラーが変更されたかどうかを確認してください。 – van

答えて

0

モデルを含むさまざまなモジュールをインポートすることを覚えていますか?私は一番下のトン持っている私ののinitの.pyで :それは問題ではない場合、私はわからないんだけど

from comparty3.model.users import User, UserGroup, Permission 
from comparty3.model.pages import PageGroup, Page 
etc... 

を。

metadata = MetaData() 

# declarative table definitions 
Base = declarative_base() 
Base.metadata = metadata 

に:しかし、あなたは、変更しようとした

# declarative table definitions 
Base = declarative_base() 
metadata = Base.metadata 

私はここで推測しているが、それは()特別なメタデータオブジェクトを作成し、そのdeclarative_baseかもしれません。 これは私のパイロンプロジェクトで定義されている方法です(あなたのコードが出ていると思います)。

+0

こんにちは、はい私は__init__.pyファイルにすべてのクラスをインポートしています。あなたが言及した例に変更しようとしましたが、何も変わっていません。 – Marek

1

マレーク、スキル名、つまり 'test.t_vfilers.filer_id'(ここで 'test'はスキーマ名)と一緒に外部キーを定義してみてください。これは問題を解決します。

関連する問題