用pymysql远程加载MySQL数据,遇到的数据表不能写中文问题及解决全过程

# 如何从mysql里查数据
# 安装两个包
#  pip install pymysql
# pip install sqlalchemy

在这里插入图片描述

import numpy as np
import pandas as pd

import pymysql
import sqlalchemy

主要用于查询的数据加载

  • pymysql
  • sqlalchemy

写入数据

  • sqlalchemy
# 连接数据库时要注意:开放3318端口,本次演示关不关防火墙没有影响
# 在服务器安装docker,用docker下拉mysql5.7
# 例如执行  docker run -itd --name db_test -e MYSQL_ROOT_PASSWORD=root -p 3316:3306 mysql:5.7       意思是将3016端口映射到3306上面
#    即 访问3306,就可以连接3306了

遇到数据库连接问题:

2003, "Can't connect to MySQL server on 'xx.xx.xxx.xx' (timed out)

解决思路:
因为是远程连接,首先要考虑服务器的安全组有没有开放所对应的端口,3306是默认开放的,其他端口需要自己进入到服务器页面开放端口。

# 连接数据库
conn =pymysql.Connect(host='xx.xx.xxx.xx',
                      port=3306,
                      user='root',
                      password='root',
                      db='mysql',
                      charset ='utf8'
                     )
# 创建数据库person
with conn.cursor() as c:
    
    c.execute('drop database if exists person')
    c.execute('create database person charset utf8')

with conn.cursor() as c:
    
    # 创建表
    c.execute('drop table if exists tb_person')
    sql = """
        create table tb_person(
            id integer primary key auto_increment,
            name varchar(20),
            pwd varchar(20),
            phone varchar(11)
        ) charset =utf8
    
    """
    c.execute(sql)
    sql2 = """
        insert into tb_person(name,pwd,phone)values
        ('A','1','111'),
        ('B','2','222'),
        ('C','3','333')
    
    """
    c.execute(sql2)
    # 提交事务
    conn.commit()
    

在这里插入图片描述

df = pd.read_sql('select * from tb_person',conn)
df
idnamepwdphone
01A1111
12B2222
23C3333
# 再添加一条
df.loc[3] = [4,'D','4','444']
df
idnamepwdphone
01A1111
12B2222
23C3333
34D4444

在这里插入图片描述

# 存储数据
a = df.to_sql('tb_personl',conn)   # pymyql的连接是不能进行数据的存储
"""
DatabaseError: Execution failed on sql: SELECT name FROM sqlite_master WHERE type='table' AND name=?;
not all arguments converted during string formatting
unable to rollback
"""
# 关闭链接
conn.close()
# sqlalchemy.engine.create_engine()
"""
engine = create_engine("mysql://scott:tiger@hostname/dbname",
                                encoding='latin1', echo=True)
"""
'\nengine = create_engine("mysql://scott:tiger@hostname/dbname",\n                                encoding=\'latin1\', echo=True)\n'
db_url = 'mysql+pymysql://root:root@xx.xx.xxx.xx:3306/person'
conn = sqlalchemy.engine.create_engine(db_url,encoding='utf8',echo=True)
# 读取
pd.read_sql('select * from tb_person1',conn)
2022-04-17 21:24:24,171 INFO sqlalchemy.engine.base.Engine DESCRIBE `select * from tb_person1`
2022-04-17 21:24:24,172 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:24:44,076 INFO sqlalchemy.engine.base.Engine select * from tb_person1
2022-04-17 21:24:44,079 INFO sqlalchemy.engine.base.Engine {}
idnamepwdphone
01A1111
12B2222
23C3333
34D4444
45E5555
56王二5555

写入数据

  • sqlalchemy
# 写入数据
df.to_sql('tb_person1',conn)
# df.to_sql('tb_person1',conn,index=False) 不存索引
# df.to_sql('tb_person1',conn,index=False,if_exists='replace') 不存索引,如果存在,替换掉
2022-04-17 20:52:59,242 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2022-04-17 20:52:59,250 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,303 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2022-04-17 20:52:59,304 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,361 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2022-04-17 20:52:59,362 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,416 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8mb4' and `Collation` = 'utf8mb4_bin'
2022-04-17 20:52:59,417 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,446 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2022-04-17 20:52:59,447 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,478 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2022-04-17 20:52:59,479 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,507 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_bin AS anon_1
2022-04-17 20:52:59,508 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,593 INFO sqlalchemy.engine.base.Engine DESCRIBE `tb_person1`
2022-04-17 20:52:59,595 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,623 INFO sqlalchemy.engine.base.Engine ROLLBACK
2022-04-17 20:52:59,680 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE tb_person1 (
	`index` BIGINT, 
	id BIGINT, 
	name TEXT, 
	pwd TEXT, 
	phone TEXT
)


2022-04-17 20:52:59,680 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,729 INFO sqlalchemy.engine.base.Engine COMMIT
2022-04-17 20:52:59,757 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_tb_person1_index ON tb_person1 (`index`)
2022-04-17 20:52:59,758 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 20:52:59,816 INFO sqlalchemy.engine.base.Engine COMMIT
2022-04-17 20:52:59,879 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2022-04-17 20:52:59,883 INFO sqlalchemy.engine.base.Engine INSERT INTO tb_person1 (`index`, id, name, pwd, phone) VALUES (%(index)s, %(id)s, %(name)s, %(pwd)s, %(phone)s)
2022-04-17 20:52:59,885 INFO sqlalchemy.engine.base.Engine ({'index': 0, 'id': 1, 'name': 'A', 'pwd': '1', 'phone': '111'}, {'index': 1, 'id': 2, 'name': 'B', 'pwd': '2', 'phone': '222'}, {'index': 2, 'id': 3, 'name': 'C', 'pwd': '3', 'phone': '333'}, {'index': 3, 'id': 4, 'name': 'D', 'pwd': '4', 'phone': '444'})
2022-04-17 20:52:59,917 INFO sqlalchemy.engine.base.Engine COMMIT
# 再添加一条数据
df.loc[4] = [5,'E','5','555']
df.to_sql('tb_person1',conn,index=False,if_exists='replace')
2022-04-17 21:00:39,107 INFO sqlalchemy.engine.base.Engine DESCRIBE `tb_person1`
2022-04-17 21:00:39,108 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:00:39,166 INFO sqlalchemy.engine.base.Engine DESCRIBE `tb_person1`
2022-04-17 21:00:39,167 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:00:39,221 INFO sqlalchemy.engine.base.Engine SHOW FULL TABLES FROM `person`
2022-04-17 21:00:39,223 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:00:39,286 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `tb_person1`
2022-04-17 21:00:39,287 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:00:39,376 INFO sqlalchemy.engine.base.Engine 
DROP TABLE tb_person1
2022-04-17 21:00:39,379 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:00:39,418 INFO sqlalchemy.engine.base.Engine COMMIT
2022-04-17 21:00:39,479 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE tb_person1 (
	id BIGINT, 
	name TEXT, 
	pwd TEXT, 
	phone TEXT
)


2022-04-17 21:00:39,480 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:00:39,532 INFO sqlalchemy.engine.base.Engine COMMIT
2022-04-17 21:00:39,619 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2022-04-17 21:00:39,622 INFO sqlalchemy.engine.base.Engine INSERT INTO tb_person1 (id, name, pwd, phone) VALUES (%(id)s, %(name)s, %(pwd)s, %(phone)s)
2022-04-17 21:00:39,624 INFO sqlalchemy.engine.base.Engine ({'id': 1, 'name': 'A', 'pwd': '1', 'phone': '111'}, {'id': 2, 'name': 'B', 'pwd': '2', 'phone': '222'}, {'id': 3, 'name': 'C', 'pwd': '3', 'phone': '333'}, {'id': 4, 'name': 'D', 'pwd': '4', 'phone': '444'}, {'id': 5, 'name': 'E', 'pwd': '5', 'phone': '555'})
2022-04-17 21:00:39,654 INFO sqlalchemy.engine.base.Engine COMMIT
# 再添加一条中文的
df.loc[5] = [6,'王二','5','555']
df.to_sql('tb_person1',conn,index=False,if_exists='replace')
2022-04-17 21:03:11,677 INFO sqlalchemy.engine.base.Engine DESCRIBE `tb_person1`
2022-04-17 21:03:11,678 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:03:11,736 INFO sqlalchemy.engine.base.Engine DESCRIBE `tb_person1`
2022-04-17 21:03:11,737 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:03:11,792 INFO sqlalchemy.engine.base.Engine SHOW FULL TABLES FROM `person`
2022-04-17 21:03:11,795 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:03:11,827 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `tb_person1`
2022-04-17 21:03:11,829 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:03:11,898 INFO sqlalchemy.engine.base.Engine 
DROP TABLE tb_person1
2022-04-17 21:03:11,899 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:03:11,938 INFO sqlalchemy.engine.base.Engine COMMIT
2022-04-17 21:03:11,998 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE tb_person1 (
	id BIGINT, 
	name TEXT, 
	pwd TEXT, 
	phone TEXT
)


2022-04-17 21:03:12,001 INFO sqlalchemy.engine.base.Engine {}
2022-04-17 21:03:12,048 INFO sqlalchemy.engine.base.Engine COMMIT
2022-04-17 21:03:12,103 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2022-04-17 21:03:12,106 INFO sqlalchemy.engine.base.Engine INSERT INTO tb_person1 (id, name, pwd, phone) VALUES (%(id)s, %(name)s, %(pwd)s, %(phone)s)
2022-04-17 21:03:12,108 INFO sqlalchemy.engine.base.Engine ({'id': 1, 'name': 'A', 'pwd': '1', 'phone': '111'}, {'id': 2, 'name': 'B', 'pwd': '2', 'phone': '222'}, {'id': 3, 'name': 'C', 'pwd': '3', 'phone': '333'}, {'id': 4, 'name': 'D', 'pwd': '4', 'phone': '444'}, {'id': 5, 'name': 'E', 'pwd': '5', 'phone': '555'}, {'id': 6, 'name': '王二', 'pwd': '5', 'phone': '555'})
2022-04-17 21:03:12,138 INFO sqlalchemy.engine.base.Engine COMMIT

此时:
在这里插入图片描述
如何让数据表显示中文呢?

1.用bash的方式进容器 docker exec -it db_test bash
2.进入到mysql的配置文件 cd mysql
3.进到mysql.conf.d目录,修改mysqld.cnf文件
4.把这句话追加到文件里 
echo 'character-set-server=utf8'  >> mysqld.conf
5.进入到conf.d目录,修改mysql.cnf文件
6.把这句话追加到文件里
echo 'default-character-set=utf8' >> mysql.cnf
7.然后 exit 退出
8.重启数据库docker restart db_test
9.查看日志docker logs db_test
10.查看数据表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
此时:

show variables like 'character%';

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今晚务必早点睡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值