[英]SQLAlchemy - create table template
我刚开始使用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中
在_ init _.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'
我试图直接在Filer类中定义id键(并从声明中删除Basic_Table),但这并没有解决问题。
我创建数据库的代码如下所示#!/ usr / bin / python import来自sqlalchemy.engine.url的ConfigParser导入模型导入的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)
有谁知道如何解决这个问题?
Marek,做一件事尝试定义外键以及模式名称,即'test.t_vfilers.filer_id'(这里'test'是模式名称),这将解决问题。
您是否记得导入包含模型的不同模块。 在我的初始 .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()创建了一个特殊的元数据对象。 这是我在我的pylons项目中定义的方式(我猜测你的代码也是如此)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.