用python对Mysql做坏坏的事:联接与新建
2017-03-01 本文已影响25人
三层肚腩君
使用的是支持3.0以上mysql.connector模块。因为这货是安装Mysql时自带的,不用满世界去找。官方手册在:https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html
本笔记是对是官方手册的瞎鸡儿理解,正文在注释中
使用方法
链接数据库
官方介绍了三种链接方法。本着人之初,性本懒的特性,就学最后一种吧。
import mysql.connector
config={'host':'127.0.0.1',#默认127.0.0.1
'user':'root',
'password':'password',
'port':3306 ,#默认即为3306
'database':'test1',#这里似乎是选择数据库。后面有类似的操作,可以删掉。
'charset':'utf8'#默认即为utf8,说是为了更好的处理中文,也许吧。
} #默认值就是安装的时候,一路下一步,没有瞎鸡吧乱设置。
#下面就厉害了,用了python异常处理的语句。感觉一下了就高端了几个级数。哈哈
#这玩意执行try语句的内容,不成就把错误返回到python客户端。不用的话,好像就报错而已。
#就当是作文模版,随时用用,也不是什么坏事。
try:
cnn=mysql.connector.connect(**config)
cursor = cnn.cursor() #这句话是很重要的,获取光标。有了它才能进行操作。
print('Yeah!you connceted!')
except mysql.connector.Error as e:
print('connect fails!{}'.format(e))
#这里是Python中格式化输出的内容。一直有%的方法,没什么地方要用这个东西。
手册里还有这么一句:
If you have lots of connection arguments, it's best to keep them in a dictionary and use the ** operator
大概就是可以用在多个链接请求时吧。摊手。
创建表单
之前看网上的都是只能一次创一个,看了官方手册才知道创建多个也不是多难的事。
tables = {} #先建一个空字典,再把一个一个表单向里塞。
#但是为什么在Python中就不用;来结束语句呀。每句的双引号又是什么鬼呀。diao大的萌妹给说声。
tables['employees'] = (
"create table `employees` ("
" `emp_no` int(11) not null auto_increment,"
" `birth_date` date not null,"
" `first_name` varchar(14) not null,"
" `last_name` varchar(16) not null,"
" `gender` enum('m','f') not null,"
" `hire_date` date not null,"
" primary key (`emp_no`)"
") engine=innodb") #声明引擎是什么鬼,感觉不用这句也行的。
tables['departments'] = (
"create table `departments` ("
" `dept_no` char(4) not null,"
" `dept_name` varchar(40) not null,"
" primary key (`dept_no`), unique key `dept_name` (`dept_name`)"
") engine=innodb")
tables['salaries'] = (
"create table `salaries` ("
" `emp_no` int(11) not null,"
" `salary` int(11) not null,"
" `from_date` date not null,"
" `to_date` date not null,"
" primary key (`emp_no`,`from_date`), key `emp_no` (`emp_no`),"
" constraint `salaries_ibfk_1` foreign key (`emp_no`) "
" references `employees` (`emp_no`) on delete cascade"
") engine=innodb")
#下面是创建database的函数。
db_name = 'test2'
def create_database(cursor):
try:
cursor.execute(
"create datebase if not exists {} default character set 'utf8'".format(db_name))
# if not exists是我自己加的,可以在不存在时创建,在存在时不会报错。下面的话就有点多余了,也许。
except mysql.connector.Error as e:
print("Failed create datebase:{}".format(e))
try:
cnn.database = db_name #这里应该是切换数据库。之前还傻傻的去执行use database;
except mysql.connector.Error as e:
if e.errno == errorcode.ER_BAD_DB_ERROR:
create_database(cursor)
cnn.database = db_name
else:
print(e)
for name,ddl in tables.items():
#迭代字典的键值。版本不同,后面的方法也不一样。不知道手册是怎么用3.x的版本执行了2.x方法。黑人问号?
try:
print('create table {}:'.format(name),end='')#加上end只是为了免得瞎机吧换行。
cursor.execute(ddl)
except mysql.connector.Error as e:
if e.errno == errorcode.ER_TABLE_EXISTS_ERROR:
print('already exists.')
else:
print(e.msg)
else:
print('OK')