2017-12-09 44 views
0
변수

로 TABLENAME : 나는 매개 변수로 __tablename__를 정의하고 싶은 사용자로서파이썬 SQLAlchemy의 - 내가 파이썬에서 SQLAlchemy의를 사용하고 다음과 같이 선언 기지에서 상속 내 클래스를 선언 오전

from sqlalchemy import Column, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class SomeClass(Base): 
    __tablename__ = 'some_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

, 아닌 하드 코딩 된 값이 같은 :

class SomeClass(Base): 
    __tablename__ = f'{environment}_some_table' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 

그것은 f'{environment}_some_table'은 내가이 패키지를 가져올 때 평가 될 것이다, 따라서 내가 나중 단계에서 수정할 수 없습니다 나의 이해입니다 (예 : 대화 형 노트북). 중첩 된 클래스와 캡슐화를 통해이를 해결하려고하는 깨진 코드 조각이 있지만 외부 클래스의 인스턴스 변수를 참조 할 수는 없습니다.

class Outer: 
    def __init__(self, env): 
     self.environment = env 

    class SomeClass(Base): 
     __tablename__ = f'{self.environment}_some_table' 
     id = Column(Integer, primary_key=True) 
     name = Column(String(50)) 

이러한 클래스 사이에 특별한 관계가 설정되지 않았으므로 중첩 된 클래스를 사용하지 않는 것이 더 좋다고 두 가지 질문을 읽었습니다. 그래서이 문제를 해결하기 위해 어떤 종류의 디자인을 사용해야합니까?

미리 감사드립니다. 이 외부 인자에 의존 할 수 있도록

+0

"'f '{environment} _some_table''이 (는) 런타임 전에 평가 될 것이라는 것은"런타임 "이 의미하는 바에 달려있다. 단어의 일반적인 의미에서 그것은 실제로 런타임에 평가됩니다. –

+0

좋아요, 저는 실제로 런타임의 정의가 무엇인지 그리고 실제로 올바른지 확인했습니다. 이를 반영하기 위해 질문을 수정하겠습니다. 감사! – Pezze

답변

2

당신은 함수의 범위 내에서 모든 모델 정의 할 수 있습니다 :

def create_models(environment): 
    class SomeClass(Base): 
     __tablename__ = f'{environment}_some_table' 
     id = Column(Integer, primary_key=True) 
     name = Column(String(50)) 
    ... 
    globals().update(locals()) # update outer scope if needed 

... # some time later 
create_models('cheese') 
... # now create the db session/engine/etc ... 

보는 또 다른 선택은 내장 다시로드 방법이다. 그것을 확인해 보라.

+0

고마워, 그 매력을 일한! – Pezze