1
导入pymysql 模块;
定义一个展示数据库的函数。
import pymysql
def show_databases()
conn = pymysql.connect(host='localhost',
user='root',
password='000')
cursor = conn.cursor()
cursor.execute('show databases;')
result = cursor.fetchall()
cursor.close()
conn.close()
print(result)
show_databases()
这里仅是为了说明过程,所以此函数没有设置返回值,而是直接打印。
如下图例,运行函数,输出了当前所有的数据库。
2
输出的数据库中有4个是MySQL创建的数据库,可以把它过滤掉,打印root用户创建的数据库,方法如下:
① 定义一个全局列表,将MySQL创建的数据库装进去,
system_db = ['information_schema''mysql', 'performance_schema', 'sys']
②在show_databases() 函数内使用for循环及判断语句将其过滤掉。
for i in range(len(result)):
if result[i][0] not in system_db:
print(f'数据库名称: {result[i][0]}')
这样就仅打印了root用户建立的数据库;
3
定义一个函数create_database()用于创建数据库。
① 思路是:使用函数的递归,因为用input()函数输入数据库名称时有可能手误,或语法错误,或重复,都会报错,需要重新运行函数输入,为了避免错误,可使用try语句排除异常,然后在函数内部调用自身,进行下次输入,所以就用到递归函数的方法。
②递归的出口是,当输入0 是退出递归。
def create_database():
print('-' * 50)
print('当前数据库:')
show_databases()
print('-' * 50)
name = input('输入要创建的数据库名称,或输入 0 退出!:')
if name == '0':
show_databases()
return
print('创建数据库')
create_database()
如下图,测试递归无误。
4
把创建数据库的代码插入其中:
conn = pymysql.connect(host='localhost', user='root', password='000')
cursor = conn.cursor()
cursor.execute('create database %s' % name)
运行函数,输入新数据库,成功建立,输入0退出。
5
然而这并不完美,因为输入的数据库名称重复,或语法错误,就会报错。
例如:下图当输入重复的数据库名称时,抛出了错误代码为1007的异常。
当输入的数据库名称不符合语法规范时,抛出了错误代码为1064的异常。
错误的类型可以查看说明,和测试出来。
那么自然就想到了使用try语句来解决这个问题。
6
用try语句解决错误。
try:
cursor.execute('create database %s' % name)
except Exception:
cursor.execute('show errors')
error = cursor.fetchone()
print(error)
create_database()
else:
print('新数据库【%s】创建成功!' % name)
create_database()
如果捕获到异常,可以调用自身,继续输入。直到输入0退出。
如果输入正确,执行else语句块,直到输入0退出。
7
也可以根据获取的错误信息,进行判断用中文显示。
因为输入数据库名称错误,无非是重复(代码1007),或语法错误(代码1064),所以可以用简短的语句来打印。
改写如下:
try:
cursor.execute('create database %s' % name)
except Exception:
cursor.execute('show errors')
error = cursor.fetchone()
if error[1] == 1007:
print('此数据库已经存在!')
create_database()
elif error[1] == 1064:
print('命名数据库语法错误!')
create_database()
else:
print('输入异常!')
create_database()
else:
print('新数据库【%s】创建成功!' % name)
create_database()
END