如何确定数据库及其表的特征?

262 阅读4分钟

如何确定数据库及其表的特征

出于安全原因,不能依赖用户了解数据库结构来进行查询。即使用户这样做了,也不应该编写假设这一点的代码。

你永远不知道用户是谁,用户会寻求什么邪恶的结果。鉴于想要破坏代码和利用数据的人比您知道的要多,最佳做法是限制用户对数据库的了解,并验证最终用户输入到程序中的任何数据的完整性。

毫无疑问,限制用户对数据库的了解的最佳方法是以用户无法编辑的方式为用户提供设置选项。

在图形用户界面 (GUI) 中,这通常通过下拉菜单和单选按钮完成。在基于终端的程序中,列出了选项。前者使程序员能够控制环境,从而使用户要么选择设置选项,要么不使用应用程序。在基于终端的程序或GUI的文本框的情况下,仍然必须评估用户输入的数据。否则,处理不当的错误会使系统面临技术破坏甚至入室盗窃。

为了评估来自用户的数据输入,通常识别已安装变量的参数,然后通过一系列条件验证输入。此类参数可以包括字符串长度、变量类型、仅字母字符、字母数字字符或其他条件。

如果数据在途中的任何地方失败,程序将向用户打印自定义的错误消息,不是 Python 或其他辅助进程抛出的消息。相反,它是检测到该错误消息时给出的消息。然后,将指示用户执行给定的操作 - 联系其管理员、更改其输入等。该方案适用于大多数情况。但是,在数据库驱动的应用程序,其中必须实施更高级的措施。

例如,如果您有多个可以搜索的表,则必然希望每个人都有不同的程序。

相反,将搜索问题抽象到可以由用户自行决定将同一搜索功能应用于任何表的位置更有意义。

问题细分如下:

1. 确定存在哪些表

2. 为基于终端的程序为每个程序分配一个编号

3.为用户提供选项

4. 允许用户详细说明搜索查询

5. 确保表的数据输入是选项 6.运行查询

7. 打印结果

确定存在哪些表

在 MySQL 会话中,可通过以下命令获得数据库的表:

SHOW TABLES in <database name>;

这允许您指定与当时使用的数据库不同的数据库。

如果在 MySQLdb 的参数中指定使用的数据库进行连接,则不需要指定数据库名称。

在 Python 中,我们将SHOW TABLES语句传递给execute()并处理返回的数据。

>>> statement = """SHOW TABLES""" 
>>> command = cur.execute(statement) 
>>> results =cur.fetcha1l()

以前,我们将所需的部分迭代输出。

现在,我们将启动一个列表并将表名附加到其中。

>>>table_list=[]

>>> for record in results:

table_list.append(record[0])

为每个表分配一个编号

使用列表,我们可以离散地访问每个项目,而无需为其提供编号。但是,为了确保该过程一目了然,我们可以将列表处理到字典中,使用项目的序号加 1 作为键值。


>>>item_dict={}

>>> for item in xrange(1,1en(table_list)):

item_dict[item-1] = table_list[item-1]

其效果是,列表的第一项(通常使用下标 o 访问)被分配了键值 1。所有其他表的处理方式类似,我们设置为扩展到数据库中任意数量的表。

为用户提供选项

向用户提供选项,我们只需打印出键值作为表名的指示符。

>>> for key in item_dict:

print "%s => %s" %(key, item_dict[key])

>>> choice = input("Please enter your choice of table to be queried. ")

为了验证输入,我们将检查该值是否是与提供的值相同范围内的整数。但是,如下所示,我们也可以将程序编码为自我验证。但是,请注意,这应该是对适当安全检查的补充。人们永远不知道下一个编辑代码的人会多么匆忙地接近这项任务。


本文正在参加「金石计划 . 瓜分6万现金大奖」