2017-12-09 24 views
0

ように私はPythonでSQLAlchemyのを使用していますが、次のように宣言型のベースから継承私のクラスを宣言していますテーブル名:私は、パラメータとして__tablename__を定義したいユーザーとしてPythonの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)) 

これらのクラス間に特別な関係が確立されていないため、ネストされたクラスを使用しないほうがよいという2つの質問があります。 この問題を解決するにはどのようなデザインを使用しますか?

ありがとうございます!

+0

"実行時に' f '{環境} _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

関連する問題