# 如何从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
id | name | pwd | phone | |
---|---|---|---|---|
0 | 1 | A | 1 | 111 |
1 | 2 | B | 2 | 222 |
2 | 3 | C | 3 | 333 |
# 再添加一条
df.loc[3] = [4,'D','4','444']
df
id | name | pwd | phone | |
---|---|---|---|---|
0 | 1 | A | 1 | 111 |
1 | 2 | B | 2 | 222 |
2 | 3 | C | 3 | 333 |
3 | 4 | D | 4 | 444 |
# 存储数据
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 {}
id | name | pwd | phone | |
---|---|---|---|---|
0 | 1 | A | 1 | 111 |
1 | 2 | B | 2 | 222 |
2 | 3 | C | 3 | 333 |
3 | 4 | D | 4 | 444 |
4 | 5 | E | 5 | 555 |
5 | 6 | 王二 | 5 | 555 |
写入数据
- 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%';