【发布时间】: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