从数据库表名构建下拉列表

时间:2014-08-13 05:31:33

标签: mysql flask sqlalchemy flask-sqlalchemy wtforms

我有这个应用程序,我想将一些Web界面部署到syslog服务器。

所以syslogserver确实把他的东西写进了mysql数据库。我已经有了构建 应用程序的一些部分,除了我要构建下拉选择表单的特定部分,以选择数据库中的主机表。

实际上我正在使用烧瓶,烧瓶 - sqlalchemy和wtforms。所以我尝试在QuerySelectField'上实现这个,不知怎的,我只得到一个没有显示表名条目的下拉列表。

我应该提一下,数据库内部的表是动态创建的。对于我的模型,我使用了sqlalchemy的automap_base()功能:

model.py

Base = automap_base()

engine = create_engine("mysql://sumuser:tehpass@127.0.0.1/syslog")

Base.prepare(engine, reflect=True)

session = Session(engine)

这是我的表格中的内容:

forms.py

def factoryHelper():
    return  session.query("information_schema.tables.table_name from information_schema.tables where information_schema.tables.table_name like 'messages_hostname0'")



class HostSelectForm(Form):
    title = TextField('Fooblah')
    hostTables = QuerySelectField(query_factory=factoryHelper,allow_blank=True)

并且在视图中:

views.py

@app.route('/index/', defaults={'page':1})
@app.route('/index/page/<int:page>')
def index(page):
    form = HostSelectForm()
    count = session.execute("select host,facility,level,msg from messages_hostname0").rowcount
    pagination = Pagination(page, PER_PAGE, count)
    return render_template('index.html', pagination=pagination, form=form)

那么我还能从动态创建的表名创建一个下拉菜单吗?如果我使用自动功能?提前谢谢。

1 个答案:

答案 0 :(得分:0)

不知怎的,我设法在model.py中解决了这个问题:

def reflectTables():
    for i in Base.classes.items():
        yield i[0]


def stripTables():
    tablelist = []
    datelist = []
    re0 = r"^(?P<prefix>[a-zA-Z]*)\_(?P<mid>[a-zA-Z,0-9]*)\_(?P<suffix>[0-9]*)"
    myre = re.compile(re0, re.MULTILINE)
    for x,table in enumerate(reflectTables()):
        striptablename = re.match(myre, table.strip("\n"))
        if striptablename:
            tablelist.append((x, striptablename.group(2)))
            datelist.append((x, striptablename.group(3)))
    return dicht(tablelist,datelist)

forms.py:

AVAILABLE_CHOICES = stripTables()

class HostSelectForm(Form):
    tableSelect = SelectField('LogHost', choices=AVAILABLE_CHOICES, default=0)

和finnaly在views.py:

 if request.method == "GET":

        count = session.query("* from mytable_monitory_counts")
        items = session.execute("select * from mytable_%s_%s limit %s, %s" % \
                                (tableslector[int(request.values['tableSelect'])][1],\
                                 datelist[int(request.values['tableSelect'])][1], my_start_range, PER_PAGE)).fetchall()
        pagination = Pagination(page=page, total=count.count(), search=search, record_name='hosts')

        if not items and page != 1: 
            in_error()

        return render_template('index.html', pagination=pagination, form=form, items=items)