我想通过自定义sql查询填充表格。我完全不知道如何完成此操作,扫描了flask-admin文档并在Google周围搜索,但是什么都没有出现。
我的数据库模型:
class Attrib(db.Model):
__tablename__ = 'attribs'
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(255,u'utf8_unicode_ci'),nullable=False,unique=True)
persistent = db.Column(db.Integer,server_default=db.FetchedValue())
parent = db.Column(db.String(256,server_default=db.FetchedValue())
ts = db.Column(db.DateTime,server_default=db.FetchedValue())
class Entry(db.Model):
__tablename__ = 'entries'
id = db.Column(db.Integer,primary_key=True)
node_id = db.Column(db.ForeignKey(u'nodes.id',onupdate=u'CASCADE'),index=True)
attrib_id = db.Column(db.ForeignKey(u'attribs.id',index=True)
value = db.Column(db.String(256,index=True)
ts = db.Column(db.DateTime,server_default=db.FetchedValue())
attrib = db.relationship(u'Attrib',primaryjoin='Entry.attrib_id == Attrib.id',backref=u'entries')
node = db.relationship(u'Node',primaryjoin='Entry.node_id == Node.id',backref=u'entries')
class Node(db.Model):
__tablename__ = 'nodes'
id = db.Column(db.Integer,unique=True)
node_enabled = db.Column(db.Integer,nullable=False)
wit_enabled = db.Column(db.Integer,nullable=False)
ts = db.Column(db.DateTime,server_default=db.FetchedValue())
class WebView(db.Model):
__tablename__ = 'overview'
id = db.Column(db.Integer,primary_key=True)
NODE_ID = db.Column(db.Integer,nullable=False)
NODE = db.Column(db.String(256,u'utf8_unicode_ci'))
LOCATION = db.Column(db.String(256,u'utf8_unicode_ci'))
IS_CLUSTER = db.Column(db.String(256,u'utf8_unicode_ci'))
MAN_SYS_NAME = db.Column(db.String(256,u'utf8_unicode_ci'))
HAS_CICS = db.Column(db.String(256,u'utf8_unicode_ci'))
OS_LEVEL = db.Column(db.String(256,u'utf8_unicode_ci'))
HAS_COBOL = db.Column(db.String(256,u'utf8_unicode_ci'))
HAS_ORACLE = db.Column(db.String(256,u'utf8_unicode_ci'))
MEM_VALUE = db.Column(db.String(256,u'utf8_unicode_ci'))
HAS_TUXEDO = db.Column(db.String(256,u'utf8_unicode_ci'))
STORAGE_VALUE = db.Column(db.String(256,u'utf8_unicode_ci'))
IS_LPM = db.Column(db.String(256,u'utf8_unicode_ci'))
HAS_SAP = db.Column(db.String(256,u'utf8_unicode_ci'))
CPU_VALUE = db.Column(db.String(256,u'utf8_unicode_ci'))
CLUSTER_RGS = db.Column(db.String(256,u'utf8_unicode_ci'))
HA_LEVEL = db.Column(db.String(256,u'utf8_unicode_ci'))
CLUSTER_NODES = db.Column(db.String(256,u'utf8_unicode_ci'))
CLUSTER_NAME = db.Column(db.String(256,u'utf8_unicode_ci'))
CPU_POOL = db.Column(db.String(256,u'utf8_unicode_ci'))
AME_FactOR = db.Column(db.String(256,u'utf8_unicode_ci'))
SYS_PROFILE = db.Column(db.String(256,u'utf8_unicode_ci'))
INFO_MAIL = db.Column(db.String(256,u'utf8_unicode_ci'))
HOSTNAME = db.Column(db.String(256,u'utf8_unicode_ci'))
OS_TYPE = db.Column(db.String(256,u'utf8_unicode_ci'))
Java6_64 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java7_64 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java8_64 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java5_64 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java8 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java5 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java14 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java7 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java71 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java71_64 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java14_64 = db.Column(db.String(256,u'utf8_unicode_ci'))
Java6 = db.Column(db.String(256,u'utf8_unicode_ci'))
UPTIME = db.Column(db.String(256,u'utf8_unicode_ci'))
IP = db.Column(db.String(256,u'utf8_unicode_ci'))
IP_LONG = db.Column(db.String(256,u'utf8_unicode_ci'))
CLUSTER_nodename = db.Column(db.String(256,u'utf8_unicode_ci'))
RG_SERVICE_IP_LONG = db.Column(db.String(256,u'utf8_unicode_ci'))
HAS_snA = db.Column(db.String(256,u'utf8_unicode_ci'))
我的模型视图:
class AixOverview(ModelView):
column_list = ('NODE','LOCATION','OS_TYPE','OS_LEVEL','HA_LEVEL','CLUSTER_NAME','CPU_POOL','CPU_VALUE','MEM_VALUE','INFO_MAIL')
column_searchable_list = ('NODE',)
column_filters = ('NODE','IS_CLUSTER','IS_LPM','CLUSTER_RGS','CLUSTER_NODES','HAS_ORACLE','HAS_COBOL','HAS_CICS','HAS_snA','HAS_TUXEDO','HAS_SAP')
#column_editable_list = ('NODE',)
column_display_pk = True
column_hide_backrefs = False
can_create = True
can_edit = True
can_delete = True
can_export = True
list_template = 'my_aix_admin_index.html'
class AixNodes(ModelView):
column_display_pk = True
column_hide_backrefs = False
column_list = [c_attr.key for c_attr in inspect(Node).mapper.column_attrs]
#can_create = False
#can_edit = False
#can_delete = True
#can_export = True
#column_filters = ('node_enabled','wit_enabled')
#column_searchable_list = ('name',)
#column_editable_list = ('name','node_enabled','wit_enabled')
#column_list = ['name','wit_enabled','ts']
#form_columns = [Entry.attrib_id,Entry.node_id]
#column_auto_select_related = True
class AixAttributes(ModelView):
column_display_pk = True
column_hide_backrefs = False
column_list = [c_attr.key for c_attr in inspect(Attrib).mapper.column_attrs]
#can_create = False
#can_edit = False
#can_delete = False
#can_export = True
#column_filters = ('persistent','parent')
#column_searchable_list = ('name','persistent','parent')
class AixEntries(ModelView):
column_display_pk = True
column_hide_backrefs = False
column_list = [c_attr.key for c_attr in inspect(Entry).mapper.column_attrs]
def __str__(self):
return self.text
#can_create = False
#can_edit = False
#can_delete = False
#can_export = True
#column_list = ['value','ts']
#column_searchable_list = ('value',)
#column_editable_list = ('value',)
#column_filters = ('value',)
这一切都很好,因为我可以进行CRUD操作,但我仍然是一个绝对的谜 如何使用以下sql填充“概述”表。所以我在哪里/如何运行此查询?
select `n`.`id` AS `NODE_ID`,`n`.`name` AS `NODE`,max(if((`a`.`name` = 'LOCATION'),`e`.`value`,NULL)) AS `LOCATION`,max(if((`a`.`name` = 'IS_CLUSTER'),NULL)) AS `IS_CLUSTER`,max(if((`a`.`name` = 'MAN_SYS_NAME'),NULL)) AS `MAN_SYS_NAME`,max(if((`a`.`name` = 'HAS_CICS'),NULL)) AS `HAS_CICS`,max(if((`a`.`name` = 'OS_LEVEL'),NULL)) AS `OS_LEVEL`,max(if((`a`.`name` = 'HAS_COBOL'),NULL)) AS `HAS_COBOL`,max(if((`a`.`name` = 'HAS_ORACLE'),NULL)) AS `HAS_ORACLE`,max(if((`a`.`name` = 'MEM_VALUE'),NULL)) AS `MEM_VALUE`,max(if((`a`.`name` = 'HAS_TUXEDO'),NULL)) AS `HAS_TUXEDO`,max(if((`a`.`name` = 'STORAGE_VALUE'),NULL)) AS `STORAGE_VALUE`,max(if((`a`.`name` = 'IS_LPM'),NULL)) AS `IS_LPM`,max(if((`a`.`name` = 'HAS_SAP'),NULL)) AS `HAS_SAP`,max(if((`a`.`name` = 'CPU_VALUE'),NULL)) AS `CPU_VALUE`,max(if((`a`.`name` = 'CLUSTER_RGS'),NULL)) AS `CLUSTER_RGS`,max(if((`a`.`name` = 'HA_LEVEL'),NULL)) AS `HA_LEVEL`,max(if((`a`.`name` = 'CLUSTER_NODES'),NULL)) AS `CLUSTER_NODES`,max(if((`a`.`name` = 'CLUSTER_NAME'),NULL)) AS `CLUSTER_NAME`,max(if((`a`.`name` = 'CPU_POOL'),NULL)) AS `CPU_POOL`,max(if((`a`.`name` = 'AME_FactOR'),NULL)) AS `AME_FactOR`,max(if((`a`.`name` = 'SYS_PROFILE'),NULL)) AS `SYS_PROFILE`,max(if((`a`.`name` = 'INFO_MAIL'),NULL)) AS `INFO_MAIL`,max(if((`a`.`name` = 'HOSTNAME'),NULL)) AS `HOSTNAME`,max(if((`a`.`name` = 'OS_TYPE'),NULL)) AS `OS_TYPE`,max(if((`a`.`name` = 'Java6_64'),NULL)) AS `Java6_64`,max(if((`a`.`name` = 'Java7_64'),NULL)) AS `Java7_64`,max(if((`a`.`name` = 'Java8_64'),NULL)) AS `Java8_64`,max(if((`a`.`name` = 'Java5_64'),NULL)) AS `Java5_64`,max(if((`a`.`name` = 'Java8'),NULL)) AS `Java8`,max(if((`a`.`name` = 'Java5'),NULL)) AS `Java5`,max(if((`a`.`name` = 'Java14'),NULL)) AS `Java14`,max(if((`a`.`name` = 'Java7'),NULL)) AS `Java7`,max(if((`a`.`name` = 'Java71'),NULL)) AS `Java71`,max(if((`a`.`name` = 'Java71_64'),NULL)) AS `Java71_64`,max(if((`a`.`name` = 'Java14_64'),NULL)) AS `Java14_64`,max(if((`a`.`name` = 'Java6'),NULL)) AS `Java6`,max(if((`a`.`name` = 'UPTIME'),NULL)) AS `UPTIME`,max(if((`a`.`name` = 'IP'),NULL)) AS `IP`,max(if((`a`.`name` = 'IP_LONG'),NULL)) AS `IP_LONG`,max(if((`a`.`name` = 'CLUSTER_nodename'),NULL)) AS `CLUSTER_nodename`,max(if((`a`.`name` = 'RG_SERVICE_IP_LONG'),NULL)) AS `RG_SERVICE_IP_LONG`,max(if((`a`.`name` = 'HAS_snA'),NULL)) AS `HAS_snA` from ((`aix_registry`.`entries` `e` left join `aix_registry`.`nodes` `n` on((`n`.`id` = `e`.`node_id`))) left join `aix_registry`.`attribs` `a` on((`a`.`id` = `e`.`attrib_id`))) where (`a`.`parent` = 'NODE') group by `n`.`name` order by `n`.`id`