簡體   English   中英

SQLAlchemy - 創建表模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM