Python Flask (sqlachemy) - проверять имя базы данных, если существует после ввода пользователем имени таблицы в форму? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть форма, которая просит пользователя ввести имя таблицы базы данных, а затем мое приложение использует это имя таблицы для выполнения запроса к базе данных 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')

Повышение ValidationError отлично работает для метода validate_path, но не работает для метода validate_table_name. Я предполагаю, что это связано спопробуй принять операторы, кто-нибудь знает функцию, которую я мог бы использовать для проверки, если таблица существует в базе данных и возвращает либо 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 выполнить. Я определенно озадачен.

1 Ответ

0 голосов
/ 04 ноября 2019

Я наконец-то решил это. Не уверен, почему это так, но когда я объявил имя метода validate-table_name () внутри моего класса RespondentForm, мне нужно было присвоить ему имя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...