使用模块
现在 MySQL Shell 已设置为在保存模块的路径中进行搜索,我们可以在 MySQL Shell 中使用它。
例如要获取 world.city 表的描述,可以使用以下命令:
mysql-py> import table_tools mysql-py> \use world Default schema `world` accessible through db. mysql-py> table_tools.describe(db.city) Field Type Null Key Default Extra ------------------------------------------------------------------ ID int(11) NO PRI None auto_increment Name char(35) NO CountryCode char(3) NO MUL District char(20) NO Population int(11) NO 0
“\use world”命令将默认模式设置为世界数据库。
作为副作用,它还使世界数据库中的表可用作 db 对象的属性。
因此,可以将 world.city 表的对象作为 db.city 传递给 table_tools.describe() 函数。
这就对了。
现在轮到我们探索使用 MySQL Shell 开启的可能性。
示例模块
出于本文档的目的,以下代码应保存在文件 table_tools.py 中。
我们可以将其保存在我们保存 Python 库的任何目录中。
代码是:
def describe(table): fmt = "{0:<11} {1:<8} {2:<4} {3:<3} {4:<9} {5:<14}" # Create query against information_schema.COLUMNS session = table.get_session() i_s = session.get_schema("information_schema") i_s_columns = i_s.get_table("COLUMNS") query = i_s_columns.select( "COLUMN_NAME AS Field", "COLUMN_TYPE AS Type", "IS_NULLABLE AS `Null`", "COLUMN_KEY AS Key", "COLUMN_DEFAULT AS Default", "EXTRA AS Extra" ) query = query.where("TABLE_SCHEMA = :schema AND TABLE_NAME = :table") query = query.order_by("ORDINAL_POSITION") query = query.bind("schema", table.schema.name) query = query.bind("table", table.name) result = query.execute() # Print the column names column_names = [column.column_name for column in result.get_columns()] print(fmt.format(*column_names)) print("-"*67) for row in result.fetch_all(): print(fmt.format(*row))
describe 函数接受一个 Table 对象,它从中反向工作以获取会话对象。
然后它查询 information_schema.COLUMNS 视图以获取与 DESC SQL 命令相同的表信息。
表和模式名称都可以通过表对象找到。
最后,打印信息。
该示例对于一般用途过于简化,因为它不会根据数据的长度更改输出的宽度,并且没有任何错误处理。
但是,这是有意将重点放在 MySQL Shell 中代码的使用上,而不是代码上。
注意:除了行作为 mysqlx.result.Row 对象返回之外,相同的代码适用于 MySQL 连接器/Python 脚本。
因此,打印行的循环看起来有点不同:
for row in result.fetch_all(): values = [row[name] or "" for name in column_names] print(fmt.format(*values))
函数准备好后,是时候看看如何将它导入 MySQL Shell 了。
MySQL Shell 是一个很好的使用 MySQL 的工具。
与传统的 mysql 命令行客户端相比,它的突出特点之一是除了 SQL 语句外,还支持 JavaScript 和 Python。
这允许我们编写原本必须在客户端外部编写的代码。
本文档将研究 Python 的使用,更具体地说是外部模块的使用。
使用标准模块
MySQL Shell 中模块的最简单用法涉及使用安装在系统默认位置的标准 Python 模块。
我们可以像在任何其他 Python 脚本中一样使用标准 Python 模块。
例如,如果我们需要创建 UUID,我们可以使用 uuid 模块:
mysql-py> import uuid mysql-py> print(uuid.uuid1().hex) 9e8ef45ea12911e8a8a6b0359feab2bb
这本身就很棒,但是我们自己的模块呢?
当然,这也是支持的。
在展示如何访问自己的模块之前,让我们创建一个简单的模块作为示例。
将模块导入 MySQL Shell
为了能够将模块导入 MySQL Shell,它必须位于 Python 搜索的路径中。
如果我们已将 table_tools.py 保存到已经搜索过的位置,那么
但是,一种可能更常见的情况是我们已将文件保存在自定义位置。
在这种情况下,我们需要告诉 Python 在哪里查找文件。
我们可以像在常规 Python 程序中一样修改 MySQL Shell 中的搜索路径。
例如,如果我们已将文件保存到 D:\MySQL\Shell\Python,则可以使用以下代码将其添加到路径中:
import sys sys.path.append("D:\MySQL\Shell\Python")
如果这是我们一次性需要的东西,那么直接在 MySQL Shell 中修改路径就可以了。
但是,如果我们正在处理一些想要重用的实用程序,它就会变得乏味。
MySQL Shell 支持可以执行命令的配置文件。
Python 的一个名为 mysqlshrc.py(JavaScript 的名为 mysqlshrc.js)。
MySQL Shell 在四个位置搜索 mysqlshrc.py 文件,包括全局位置和用户特定位置。
我们可以在 MySQL Shell 用户教程中查看完整列表和搜索顺序。
用户特定文件在 Microsoft Windows 上为 %APPDATA%\MySQL\mysqlsh\mysqlshrc.py,在 Linux 和 macOS 上为 $HOME/.mysqlsh/mysqlshrc.py。
我们可以做的不仅仅是更改 mysqlshrc.py 文件中的搜索路径。
然而,对于这个例子,不需要其他任何东西。
另一种方法是使用搜索路径设置 PYTHONPATH 环境变量。