sqlalchemyのBaseがObjectから継承するかどうか疑問に思います。以下の詳細を参照してください。
現在Python3とSQLAlchemy0.8を使用しています
私のプロジェクトでは、(オブジェクト)を使用して新しいスタイルクラスを宣言し、先に進んで「プロパティ」を使用してクラスのプロパティを定義しました。クラスは正常に機能していました「以下のサンプルコード」
class LoadFile(object):
def _set_year(self, value):
'''set the year'''
value = value[6:10]
if valid_integer(value) != True:
raise Exception ("File Name Error: The year value should be a numeral")
self._year = value
def _get_year(self):
'''get the year'''
return self._year
year = property(_get_year, _set_year)
プロジェクトが成長するにつれて、SQLAlchemyを使用するようになり、クラスを実行しましたが、エラーが発生しました
class LoadFile(object):
__tablename__ = "load_file"
id = Column(Integer(10), primary_key = True)
file_name = Column(String(250), nullable = False, unique = True)
file_path = Column(String(500), nullable = False)
date_submitted = Column(DateTime, nullable = False)
submitted_by = Column(String, nullable = False)
def _set_year(self, value):
'''set the year'''
value = value[6:10]
if valid_integer(value) != True:
raise Exception ("File Name Error: The year value should be a numeral")
self._year = value
def _get_year(self):
'''get the year'''
return self._year
year = property(_get_year, _set_year)
それが投げたエラーは次のとおりです。
AttributeError: 'LoadFile' object has no attribute '_sa_instance_state'
File "/usr/local/lib/python3.2/dist-packages/SQLAlchemy-0.8.0b2-py3.2.egg/sqlalchemy/orm/session.py", line 1369, in add
raise exc.UnmappedInstanceError(instance)
sqlalchemy.orm.exc.UnmappedInstanceError: Class '__main__.LoadFile' is not mapped
そのため、「 Base 」から継承していないことに気づいたので、クラスを次のように変更しました。
class LoadFile(Base):
これで、sqlalchemyは正常に機能し、テーブルは正常に作成されました。しかし、Eclipseで次のような警告が表示されることに気付きました。
Use of "property" on an old style class"
では、 BaseはObjectから継承しないのでしょうか?私はそれがそうすることを以前に読んだと思った。そうでなければ、なぜ私は今この「警告」を受け取っているのですか。私はそれを無視できることを知っていますが、正確な理由とおそらくそれを修正する方法を知りたいと思っていました。
ありがとう。
アップデート
以下に示すように、デコレータを使用して回避しました。このようにして、上記の「警告」は消えます
@property
def year(self):
'''get the year'''
return self._year
@year.setter
def year(self, value):
'''set the year'''
if valid_integer(value) != True:
raise Exception ("File Name Error: The year value should be a numeral")
self._year = value
これで警告が処理されます。しかし、以前の方法で警告が発生した理由はまだわかりません。また、デコレータと以前の方法のどちらを使用するのが最適かはよくわかりません。