私のアプリケーションには、ベンダー/顧客の連絡先タイプにサブクラス化された contact_types テーブルがあります。連絡先の種類はタイトルのようなものですが、常にそうとは限りません。いずれにせよ、以下の各クラスは 3 つの異なるファイルにあります。親の globals.py ファイルと 2 つの子は、customer.py ファイルと vendor.py ファイルにあります。また、ここで見つけた関数を使用して、実際の db クエリを値とともに出力し、SQL を手動で実行できるようにしました。
class ContactType(DeclarativeBase,TimeUserMixin):
__tablename__ = 'contact_types'
id = Column(Integer,primary_key=True,autoincrement=True)
_code = Column('code',Unicode(50),nullable=False)
sort_order = Column(Integer,nullable=False,default=9999)
type = Column(Unicode(1),nullable=False)
__mapper_args__ = {'polymorphic_on':type}
@hybrid_property
def code(self):
return self._code
@code.setter
def code(self,code):
self._code = code.upper()
def __init__(self,code,sort_order=None):
self.code=code
if sort_order is not None:
self.sort_order = sort_order
@property
def as_dict(self):
return {
'id':self.id,
'code':self.code
}
@classmethod
def all_as_dict(cls, ):
return [c.as_dict for c in DBSession.query(cls).order_by(cls.code)]
@classmethod
def by_id(cls,id):
return DBSession.query(cls).get(id)
@classmethod
def by_code(cls,code ):
return DBSession.query(cls).filter(cls.code == code.upper()).first()
class VendorContactType(m_globals.ContactType):
__mapper_args__ = {'polymorphic_identity':'v'}
class CustomerContactType(g.ContactType):
__mapper_args__ = {'polymorphic_identity':'c'}
Table detail ...
create_time | timestamp without time zone | not null
modify_time | timestamp without time zone | not null
id | integer | not null default nextval('contact_types_id_seq'::regclass)
code | character varying(50) | not null
sort_order | integer | not null
type | character varying(1) | not null
create_user_id | integer | not null
modify_user_id | integer | not null
Indexes:
"contact_types_pkey" PRIMARY KEY, btree (id)
"ix_contact_types_create_user_id" btree (create_user_id)
"ix_contact_types_modify_user_id" btree (modify_user_id)
Foreign-key constraints:
"contact_types_create_user_id_fkey" FOREIGN KEY (create_user_id) REFERENCES tg_user(user_id)
"contact_types_modify_user_id_fkey" FOREIGN KEY (modify_user_id) REFERENCES tg_user(user_id)
Referenced by:
TABLE "contacts" CONSTRAINT "contacts_contact_type_id_fkey" FOREIGN KEY (contact_type_id) REFERENCES contact_types(id)
select id,code,type from contact_types where code='NEW';
id | code | type
------+------+------
7242 | NEW | c
7251 | NEW | v
問題は、sqlalchemy で使用されている sql をコピーして postgres に貼り付けると、アプリケーションがレコードを見つけることができないと言って何をするかです。結果が得られます。それは腹立たしいです!!!! 継承に何か奇妙なことが起こっていると思いますが、それを見つけることができません。
これが私が得るコンソール出力です...
08:34:17,419 DEBUG [erp.model.m_ap] 0 <----- This is just a simple queryresult.count()
08:34:17,421 DEBUG [erp.model.m_ap] SELECT contact_types.code, contact_types.create_time, contact_types.modify_time, contact_types.id, contact_types.sort_order, contact_types.type, contact_types.create_user_id, contact_types.modify_user_id
FROM contact_types
WHERE contact_types.code = 'NEW' AND contact_types.type IN ('v') <--- output of printquery
したがって、結果は見つかりませんでした。ここで、上記で出力されたクエリを直接 psql に貼り付けます...
erp_beta=# SELECT contact_types.code, contact_types.create_time, contact_types.modify_time, contact_types.id, contact_types.sort_order, contact_types.type, contact_types.create_user_id, contact_types.modify_user_id
erp_beta-# FROM contact_types
erp_beta-# WHERE contact_types.code = 'NEW' AND contact_types.type IN ('v')
erp_beta-# ;
code | create_time | modify_time | id | sort_order | type | create_user_id | modify_user_id
------+----------------------------+---------------------------+------+------------+------+----------------+----------------
NEW | 2013-04-10 08:16:02.778212 | 2013-04-10 08:16:02.77822 | 7251 | 9 | v | 46 | 46
(1 row)
何を与える?