2011-07-23 76 views
4

我刚刚开始使用SQLAlchemy,我一直在想......我的模型中会有很多表格。我想为我的模型中的每个表格拥有自己的文件。SQLAlchemy - 创建表格模板

我目前使用下面的代码:

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' 

在meta.py

继_ 初始化 _.py

"""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 
      ) 

然后在所有的下面我的模特

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),但是这并不能解决问题。

我创建数据库的代码如下所示 #!的/ usr/bin中/ Python的 进口ConfigParser 从sqlalchemy.engine.url进口网址 从模型导入*

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约束。 另外我认为,如果代码全部在一个文件中,此代码可以工作吗? (当然有适当的变化)? – driax

+0

错误似乎表明无法找到__Table__,而不是__Column__。我在这里猜测,但尝试将__Filer__导入到您定义FK的模块中,并查看错误是否已更改。 – van

回答

0

您是否记得导入包含模型的不同模块。 在我初始化的.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

Marek,做一件事就是尝试定义外键以及模式名称,即'test.t_vfilers.filer_id'(这里'test'是模式名称),这样可以解决问题。