jupyter 自定义魔法指令(以连接MYSQL为例)

1、效果展示

在这里插入图片描述

2、目标代码

为了让大家更好地理解,我以连接MYSQL为例,为大家进行展示魔法指令的整个过程。如果感兴趣的朋友需要把自己的目标代码先走通流程,确认没有问题之后,再嵌入到模板中。

import pymysql
db = pymysql.connect(host="localhost", user = "root", password="88888888", database="sys")
cursor = db.cursor()
cursor.execute("show tables")
data = cursor.fetchall()
print(data)
db.close()

在这里插入图片描述
我的目的是在jupyter上连接我电脑上安装好的mysql中的sys数据库,并查看这个数据库中存在的所有表。我们可以看到,确实连接上了。流程走通了,那么接下来先看一下我自己写的模板。

3、模板简介

这个模板是我自己研究源代码写的,写了三个自定义魔法指令,分别是%lmysql,%%cmysql,%change_mysql_param和%%change_mysql_param。其作用如下:
①%lmysql。这是我自定义的行魔法指令,因为我是用行魔法指令来连接数据库并查询数据的(line_mysql),所以起了这个名。他通过装饰符@line_magic链接到内核,并进行注册而被认可,从而可以被当成内置魔法指令一样来使用。

②%%cmysql。这是我自定义的单元魔法指令,因为我是用单元魔法指令来连接数据库并查询数据的(cell_mysql),所以起了这个名。他通过装饰符@cell_magic链接到内核,并进行注册而被认可,从而可以被当成内置魔法指令一样来使用。

③%change_mysql_param和%%change_mysql_param。这是我自定义的行与单元魔法指令,也就是说,它能以行或单元的形式而存在。这是一个用来修改配置用不同的用户连接不同的数据库的语法。因为有人喜欢一行写完配置,也有人喜欢分行写,所以我用了@line_cell_magic这个修饰符,这个修饰符既承认行魔法指令,也承认单元魔法指令。

import pymysql
from IPython.core import magic_arguments
from IPython.core.magic import(Magics,magics_class,line_magic,cell_magic,line_cell_magic)

@magics_class
class PythonSql(Magics):
    
    @line_magic
    def lmysql(self,line):
        ## 这里编写的代码,将可以 %lmysql XX参数 的方式被调用

    
    @cell_magic
    def cmysql(self,line,cell):
        ## 这里编写的代码,将可以 %cmysql XX参数 的方式被调用


    @line_cell_magic
    def change_mysql_param(self, line, cell=None):
        if(line!=None and cell==None):
            ## 当你把change_mysql_param函数当行魔法指令时,在这传参
            
        elif(cell!=None):
            ## 当你把change_mysql_param函数当单元魔法指令时,在这传参
            
        else:
            ## 传参不规范就在这写提示或者pass
            
# 注册该类,使其变为魔法指令,可以以行魔法指令或者单元魔法指令的方式被使用
ipy = get_ipython()
ipy.register_magics(PythonSql)

4、嵌入模板

import pymysql
from IPython.core import magic_arguments
from IPython.core.magic import(Magics,magics_class,line_magic,cell_magic,line_cell_magic)

@magics_class
class PythonSql(Magics):
    
    @line_magic
    def lmysql(self,line):
        try:
            db = pymysql.connect(host=self.host, user = self.user, password=self.password, database=self.database)
        except:
            db = pymysql.connect(host="localhost", user = "root", password="88888888", database="sys")

        cursor = db.cursor()
        cursor.execute(line)
        data = cursor.fetchall()
        db.close()
        return data
    
    @cell_magic
    def cmysql(self,line,cell):
        try:
            db = pymysql.connect(host=self.host, user = self.user, password=self.password, database=self.database)
        except:
            db = pymysql.connect(host="localhost", user = "root", password="88888888", database="sys")

        cursor = db.cursor()
        cursor.execute(cell)
        data = cursor.fetchall()
        db.close()
        return data

    @line_cell_magic
    def change_mysql_param(self, line, cell=None):
        if(line!=None and cell==None):
            args = line.replace(' ','').split(',')
            self.host = args[0]
            self.user = args[1]
            self.password = args[2]
            self.database =  args[3]
        elif(cell!=None):
            args = cell.replace(' ','').split('\n')
            self.host = args[0]
            self.user = args[1]
            self.password = args[2]
            self.database =  args[3]
        else:
            self.host = None
            self.user = None
            self.password = None
            self.database = None
            
ipy = get_ipython()
ipy.register_magics(PythonSql)

5、是否生效

在jupyter上执行这个代码,默认配置的主机地址,用户名,密码以及数据库没错的话,就可以连接上了。我给大家分享下结果。

5.1、使用%lsmagic查看自己编写的魔法指令是否注册成功:

在这里插入图片描述

5.2、直接使用魔法指令查看是否注册成功:

5.2.1、%lmysql

使用%lmysql(使用这个行魔法指令来执行我们任何的sql),比如查看当前连接是否成功,以及连接的是哪个数据库?
在这里插入图片描述
我们从上图可以观察到,语法是生效的,它并没有报错,可以连接数据库sys,并且可以使用正常语法去查询数据。说明这个魔法指令已经生效了。

5.2.2、%%cmysql

使用%lmysql(使用这个单元魔法指令来执行我们任何的sql),比如查看当前连接是否成功,以及连接的是哪个数据库?
在这里插入图片描述
我们从上图可以观察到,语法是生效的,它并没有报错,可以连接数据库sys,并且可以使用正常语法去查询数据。说明这个魔法指令已经生效了。

5.2.3、%change_mysql_param以及%%change_mysql_param

①使用%change_mysql_param。假如我们不再需要去查询A数据库的某张表的信息,而是比如需要查询B数据库的某种表的信息,那怎么办?答案是显而易见的,那就是修改配置参数。所以这个行魔法指令的作用就是这个。
在这里插入图片描述
从图中的例子我们可以看到,连接的原数据库是sys,当我用%change_mysql_param去修改需要连接的数据库名,主机、用户名、密码不变,执行成功之后,发现再执行查询时,默认是从information_schema这个数据库去查数据了。所以改配置生效了。

②使用%%change_mysql_param。假如我们不再需要去查询A数据库的某张表的信息,而是比如需要查询B数据库的某种表的信息,那怎么办?答案是显而易见的,那就是修改配置参数。所以这个单元魔法指令的作用就是这个。它跟①不同的地方在于加入参数很长的时候,检查有没有打错是很麻烦的,这个时候,用单元魔法指令会更合适。
在这里插入图片描述
从图中的例子我们可以看到,连接的源数据库是information_schema,当我用%%change_mysql_param去修改数据库名,主机、用户名、密码不变,执行成功之后,发现再执行查询时,默认是从information_schema这个数据库去查数据了。所以改配置也生效了。

③如果不想只是换个数据库查询表,也可以不用该配置,在表的前面加个数据库名字即可。
在这里插入图片描述
从这张图我们可以知道,目前代码中默认连接的是information_schema数据库,但是也还是可以连接sys数据库的version表的,只要在表前面加个数据库名。但是如果要换用户名,密码去连接,那这个就用不上了。

6、永久配置

我们可以发现,以上配置好的魔法指令,只是暂时被注册到内核。如果jupyter被重启了,你就会发现这个配置不再生效,又需要重新执行一遍才行,这样太麻烦了。那我如果想它永久生效,每次打开都能随便使用,并且不需要再做任何额外的操作,那应该怎么办?很简单,把你写好的代码放在指定的目录,那它每次重启就会生效的。只需要两条指令即可。:

在jupyter中打开控制台。
在这里插入图片描述

然后把写好的代码(py文件)放到启动目录即可。

cd ~/.ipython/profile_default/startup
cp magic.py的绝对路径 .

第一条的指令的意思是跳转到内核的启动目录中,第二步就是把我写好的代码(magic.py)复制到这个startup目录下。这样,每次jupyter启动的时候,都会帮我们加载一遍这个文件,那么就可以达到永久生效的目的了。
在这里插入图片描述

以上就是我分享的所有内容,喜欢的朋友可以点个关注+收藏。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会点东西的普通人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值