使用模块

现在 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:使用外部 Python 模块

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

这本身就很棒,但是我们自己的模块呢?
当然,这也是支持的。
在展示如何访问自己的模块之前,让我们创建一个简单的模块作为示例。

https://onitroad.com 更多教程

将模块导入 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 环境变量。

日期:2020-09-17 00:11:14 来源:oir作者:oir