如何在Mito ORM中获取类Slot的:col-type定义?
获取Mito ORM中Slot的
:col-type定义 我在使用Mito ORM定义类的时候,给Slot指定了:col-type:
(isbn :accessor isbn :initarg :isbn :col-type (or (:varchar 128) :null))
我想知道怎么获取这个:col-type的定义?因为这是类定义里的Slot,是不是没有类似slot-definition :col-type ...的通用访问方式?
我查了CLOS MOP的文档,只找到这些可访问的方法:
slot-definition-allocation slot-definition-initargs slot-definition-initform slot-definition-initfunction slot-definition-name slot-definition-type
另外,这个isbn Slot的显示信息如下:
#<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS {1005928483}> -------------------- Name: BOOKSHOPS.MODELS:ISBN Init args: (:ISBN) Init form: #<unspecified> Init function: NIL -------------------- Group slots by inheritance [ ] Sort slots alphabetically [X] All Slots: [ ] %CLASS = #<DAO-TABLE-CLASS BOOK> [ ] %DOCUMENTATION = NIL [ ] %TYPE = T [ ] ALLOCATION = :INSTANCE [ ] ALLOCATION-CLASS = NIL [ ] COL-TYPE = (OR (:VARCHAR 128) :NULL) [ ] DEFLATE = #<unbound> [ ] GHOST = NIL [ ] INFLATE = #<unbound> [ ] INITARGS = (:ISBN) [ ] INITFORM = NIL [ ] INITFUNCTION = NIL [ ] NAME = BOOKSHOPS.MODELS:ISBN [ ] PRIMARY-KEY = NIL [ ] READERS = (BOOKSHOPS.MODELS:ISBN) [ ] REFERENCES = NIL [ ] WRITERS = ((SETF BOOKSHOPS.MODELS:ISBN))
解决方案
别担心,Mito作为CLOS的ORM扩展,已经为这类自定义的slot属性提供了专门的访问方式,只是不在你查到的CLOS MOP通用方法里而已。你可以通过下面两种方式获取:col-type的定义:
- 优先使用Mito官方提供的访问器
Mito为dao-table-column-class(也就是你看到的那个#<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS ...>对象的类)定义了专属的访问器函数,直接调用就能拿到:col-type的值:
(mito.dao.column:dao-table-column-col-type 你的slot定义对象)
把上面的“你的slot定义对象”替换成你实际拿到的那个列对象就行,比如你例子里的#<MITO.DAO.COLUMN:DAO-TABLE-COLUMN-CLASS {1005928483}>。
- 直接访问内部slot(不推荐)
从你给出的slot详情里能看到有个COL-TYPE的内部slot,你也可以用slot-value直接读取:
(slot-value 你的slot定义对象 'mito.dao.column::col-type)
不过这种方式要注意,它依赖Mito的内部实现细节,如果后续Mito更新调整了内部slot的命名,这段代码就会失效,所以还是优先用第一种官方访问器的方式更稳妥。
如果你需要一次性获取某个DAO类所有列的:col-type,可以结合mito.dao.table:dao-table-columns来批量处理:
(mapcar #'mito.dao.column:dao-table-column-col-type (mito.dao.table:dao-table-columns (find-class 'book)))
内容的提问来源于stack exchange,提问作者Ehvince
相关产品推荐
相关产品推荐

