【问题标题】:Python Flask (sqlachemy) - validate database name if exists after user inputs table name into a form?Python Flask(sqlalchemy) - 在用户将表名输入表单后验证数据库名称是否存在?
【发布时间】:2020-02-27 09:09:10
【问题描述】:

我有一个表单要求用户输入数据库表名,然后我的应用程序使用该表名在 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_path 方法,但不适用于 validate_table_name 方法。我假设它与 try accept 语句有关,有谁知道我可以用来测试 if 的函数一个表存在于数据库中并返回真或假?如果有这样的功能,那么我认为我的代码会起作用。

任何帮助将不胜感激。

编辑:

我写了一个函数来测试一个表是否存在,这里是:

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 方法。我肯定很困惑。

【问题讨论】:

  • 您是否尝试过engine.has_table(tableName) 讨论过的here
  • 我实际上最终编写了自己的函数,但很高兴知道有一个。遗憾的是,它并没有解决我的问题。无论出于何种原因,当我运行代码时,它并没有进入 validate_table_name 方法。当我在我的路线中运行命令 path = form.path.data 时,使用 form = RespondentForm(),它会进入 validate_path 方法并正确执行,但是当我运行 tabname = form.tabname.data 时,它不会执行validate_table_name 方法。它真的让我很难过。

标签: python-3.x database flask sqlalchemy


【解决方案1】:

我终于解决了这个问题。不知道为什么会这样,但是当我在我的 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

【讨论】:

    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2013-02-17
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多