MySQL-Python学习笔记
安装MySQL数据库Python Connector
目前尝试使用了两种不同的python package连接mysql数据库,根据使用体验推荐sqlalchemy包,参考廖神的文章。同时,本文记录了mysql.connector的使用和Debug笔记。(部分代码转载于以上链接)
使用mysql-connector
安装package
pip install mysql-connector-python
连接mysql数据库
import mysql.connector as mc
mydb = mysql.connector.connect(
host="localhost", # 数据库主机地址
user="yourusername", # 数据库用户名
passwd="yourpassword" # 数据库密码
database="database" # 访问的数据库名
)
运行SQL query
执行单条或多条SQL语句
mycursor = mydb.cursor()
mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY; SHOW TABLES;") # 直接运行query
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("RUNOOB", "https://www.runoob.com")
mycursor.execute(sql, val) # 类似%-formatting的方式填充sql语句并执行
mydb.commit() # 数据表内容有更新,需要使用该语句,但使用过程中发现不commit依然完成了插入数据等操作
print(mycursor.rowcount, "条记录插入成功。")
mydb.close() # close connector以免出现数据库访问冲突导致的死锁问题
批量插入数据
# formatting形式和python不同,无论插入数据类型为何都要使用%s(而非%d,%f等)
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
('Google', 'https://www.google.com'),
('Github', 'https://www.github.com'),
('Taobao', 'https://www.taobao.com'),
('stackoverflow', 'https://www.stackoverflow.com/')
]
mycursor.executemany(sql, val)
mydb.commit()
print(mycursor.rowcount, "记录插入成功。")
返回查询结果
myresult = mycursor.fetchone() # fetchone() 获取一条记录
# fetchall() 获取所有记录,返回值为list of tuples
myresult = mycursor.fetchall()
问题和Debug
python connector在insert数据到数据库中时,因为mySQL的data size限制,很容易出现server has gone away的error。
解决办法:
- 在每次打开mySQL service后,运行SQL语句:
set global innodb_buffer_pool_size=2048M # or a bigger value set global max_allowed_packet=2048M # or a bigger value
- 修改mySQL配置文件my.ini (for windows)
修改内容同上
空值问题解决:
- 对于字符数据,直接将空值改为’NULL’
- 对于数值型,直接使用NULL会报错,目前没有找到普适的方法,可以尝试将空值设置为该列不存在的值,在导入数据库后,将该值替换回NULL
使用sqlalchemy
。。。待更新