Python 3.x PythonFlask(sqlachemy)-在用户将表名输入表单后验证数据库名是否存在?

Python 3.x PythonFlask(sqlachemy)-在用户将表名输入表单后验证数据库名是否存在?,python-3.x,database,flask,sqlalchemy,Python 3.x,Database,Flask,Sqlalchemy,我有一个表单,要求用户输入数据库表名,然后我的应用程序使用该表名在MySQL数据库上运行查询。我要做的是在数据库上运行一个初始测试,看看输入的表是否存在,如果不存在,然后让用户知道提供的表名不存在,然后重试。当前,我的应用程序打开一个错误堆栈,让我知道表名不存在。这不是我想要的行为。我希望它做的是停留在页面上,然后通过突出显示红色的表单框并在框下打印错误消息来向用户发送消息。我可以将此功能用于其他领域,但似乎无法将其用于此领域。这是我在forms.py文件中的代码 class Responden

我有一个表单,要求用户输入数据库表名,然后我的应用程序使用该表名在MySQL数据库上运行查询。我要做的是在数据库上运行一个初始测试,看看输入的表是否存在,如果不存在,然后让用户知道提供的表名不存在,然后重试。当前,我的应用程序打开一个错误堆栈,让我知道表名不存在。这不是我想要的行为。我希望它做的是停留在页面上,然后通过突出显示红色的表单框并在框下打印错误消息来向用户发送消息。我可以将此功能用于其他领域,但似乎无法将其用于此领域。这是我在forms.py文件中的代码

class RespondentForm(FlaskForm):
path = StringField('Path', validators=[DataRequired()])
tabName = StringField("Table Name (only fill out if you are not sending 'Invitations')", validators=[Optional()])
choices = [('1', 'Invitation'), ('2', 'Initial reminder'), ('3', 'Subsequent reminders')]
TypeOfMail = SelectField('Select Type of Mail', choices=choices)
test = BooleanField('Send Out Test Emails')
submit = SubmitField('Return Recipients')

def validate_path(self, path):
    if not os.path.isdir(path.data):
        raise ValidationError('Path entered does not exist, please enter correct path')

def validate_table_name(self, tabName):
    engine = create_engine('URI')
    metadata = MetaData()
    try:
        test = Table(tabName.data, metadata, autoload=True, autoload_with=engine)
    except NoSuchTableError:
        raise ValidationError('Table name entered is incorrect, please enter correct table name')
raise ValidationError适用于validate\u path方法,但不适用于validate\u table\u name方法。我假设它与try accept语句有关,是否有人知道我可以使用一个函数来测试数据库中是否存在表并返回true或false?如果有这样一个函数,那么我认为我的代码可以工作

任何帮助都将不胜感激

编辑:

我编写了一个函数,用于测试表是否存在,如下所示:

def exists(tabname):
engine = create_engine('URI')
metadata = MetaData()
try:
    test = Table(tabname, metadata, autoload=True, autoload_with=engine)
    return True
except NoSuchTableError:
    return False
然后将我的validate_table_name方法更改为:

    def validate_table_name(self, tabname):
    if not exists(tabname.data):
        raise ValidationError('The table name entered does not exist, please try again')

该函数运行良好,但仍然没有什么乐趣,因为出于各种原因,我无法执行validate_table_name方法。我确实很困惑

我终于解决了这个问题。不确定为什么会出现这种情况,但当我在RespondentForm类中声明validate-table_name()方法的名称时,我需要将其命名为def validate_tabname(),这是def validate_中与声明的字段名匹配所需的关键字。(我花了一整天的时间在这上面……考虑到这是一个如此简单的解决方案,我感到非常沮丧。)

所以工作代码是:

class RespondentForm(FlaskForm):
  path = StringField('Path', validators=[DataRequired()])
  tabname = StringField("Table Name (only fill out if you are not sending 'Invitations')", validators=[Optional()])
  choices = [('1', 'Invitation'), ('2', 'Initial reminder'), ('3', 'Subsequent reminders')]
  TypeOfMail = SelectField('Select Type of Mail', choices=choices)
  test = BooleanField('Send Out Test Emails')
  submit = SubmitField('Return Recipients')

  def validate_tabname(self, tabname):
    if not exists(tabname.data):
        raise ValidationError('The table name entered does not exist, please try again')

  def validate_path(self, path):
    if not os.path.isdir(path.data):
       raise ValidationError('Path entered does not exist, please enter correct path')
使用我的自定义函数存在

def exists(tabname):
  engine = create_engine('URI')
  metadata = MetaData()
  try:
    test = Table(tabname, metadata, autoload=True, autoload_with=engine)
    return True
  except NoSuchTableError:
    return False

你试过
引擎了吗?你有没有像前面讨论的那样使用table(tableName)
?我实际上最终编写了自己的函数,但很高兴知道有一个函数。遗憾的是,它并没有解决我的问题。出于什么原因,当我运行代码时,它不会进入validate\u table\u name方法。当我在我的路径中使用form=RespondentForm()运行命令path=form.path.data时,它会进入validate_path方法并正确执行,但当我运行tabname=form.tabname.data时,它不会执行validate_table_name方法。这真让我难堪。