python 用 pymysql 新建数据库、表,通过 pandas 查看结果 https://www.cnblogs.com/shanger/p/12982110.html
从config读取配置 https://jingyan.baidu.com/article/425e69e67b9407fe14fc164f.html
目录
1、python3 + pymysql 创建数据库
2、使用pandas将DataFrame数据直接写入MySQL数据库
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost',user='root',password='123456',charset='utf8mb4')
# 创建游标
cursor = conn.cursor()
# 创建数据库的sql(如果数据库存在就不创建,防止异常)
sql = "CREATE DATABASE IF NOT EXISTS db_name"
# 执行创建数据库的sql
cursor.execute(sql)
创建表
sql_2 = '''CREATE TABLE `employee` (
`id` INT NOT NULL AUTO_INCREMENT,
`topic` INT ,
`ptid` INT NOT NULL,
`level` INT NOT NULL,
`time` TIME,
`consume` INT NOT NULL,
`err` INT NOT NULL,
`points` INT NOT NULL,
`gid` INT NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
'''
cursor.execute(sql_2)
SQL = """CREATE TABLE `income` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datetime` varchar(20) DEFAULT NULL,
`ironincome` decimal(20,2) DEFAULT NULL,
`generalincome` decimal(20,2) DEFAULT NULL,
`baiincome` decimal(20,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
"""
cursor.execute(SQL)
#执行插入语句
sql = "insert into jnl(jnl_name,jnl_date,jnl_time) values('%s','%s','%s')"%('mmk','2018-07-26','2018-07-26 11:12:30')
try:
cur.execute(sql)
conn.commit()#提交
except:
print('执行插入失败')
conn.rollback()#回滚
#执行查询语句
sql = 'select * from jnl'
try:
cur.execute(sql)
print(cur.fetchone())
except:
print('查询失败')
#执行更新语句
sql = "update jnl set jnl_name='%s' where jnl_name='%s'"% ('Hello','mmk')
try:
cur.execute(sql)
conn.commit()#提交
except Exception as e:
print('执行更新失败',e)
conn.rollback()#回滚
#执行查询语句
sql = 'select * from jnl'
try:
cur.execute(sql)
print(cur.fetchone())
except:
print('查询失败')
#执行删除语句
sql='delete from jnl'
try:
cur.execute(sql)
conn.commit()
except Exception as e :
print('删除失败')
conn.rollback()
#执行查询语句
sql = 'select * from jnl'
try:
cur.execute(sql)
print(cur.fetchone())
except:
print('查询失败')
#关闭连接
conn.close()
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.types import NVARCHAR, Float, Integer
def pd2sql():
"""
to_sql目前只支持两类mysql引擎一个是sqlalchemy和sqlliet3
:return:
"""
# 初始化数据库连接,使用pymysql模块
# MySQL的用户:root, 密码:147369, 端口:3306,数据库:mydb
# ?charset=utf8 指定数据库编码
engine = create_engine('mysql+pymysql://root:147369@localhost:3306/mydb?charset=utf8')
conn = engine.connect()
for i in range(1, 10):
# 指定字段的数据类型
dtypedict = {
'index_code': NVARCHAR(length=255),
'date': NVARCHAR(length=255),
'open': NVARCHAR(length=255),
'close': NVARCHAR(length=255),
'low': NVARCHAR(length=255),
'high': NVARCHAR(length=255),
'volume': NVARCHAR(length=255),
'money': NVARCHAR(length=255),
'change': NVARCHAR(length=255)
}
csv_path = r'E:\data\yucezhe\trading-data-push.20190201\2019-02-01 index data.csv'
# 读取本地CSV文件
df = pd.read_csv(csv_path).head()
# 将DataFrame储存为MySQL中的数据表,不储存index列
df.to_sql(f'csv_table{i}', engine, if_exists='replace', index=False, dtype=dtypedict)
# 执行原生sql语句
# 设置主键
conn.execute(f"alter table csv_table{i} add constraint p_key primary key (index_code)")
# 从表设置外键
if i%2 == 0:
conn.execute(
f"alter table csv_table{i-1} add foreign key (index_code) references csv_table{i}(index_code)")
print(f"Write to MySQL successfully! ---- csv_table{i}")
engine.dispose()
pd2sql()
# 对已存在的表做主键:alter table csv_short1 add constraint p_key primary key (index_code);
# 对已存在的表做外键:alter table csv_short1 add foreign key (index_code) references csv_short2(index_code);
# 内连接查询:select * from a,b where a.x = b.x
create_engine用法
engine = create_engine('dialect+driver://username:password@host:port/database')
dialect -- 数据库类型
driver -- 数据库驱动选择
username -- 数据库用户名
password -- 用户密码
host 服务器地址
port 端口
database 数据库
pandas.to_sql函数用法:
主要有以下几个参数:
name: 输出的表名
con: 与read_sql中相同,数据库链接
if_exits: 三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;append:若表存在,将数据写到原表的后面。默认为fail
index:是否将df的index单独写到一列中
index_label:指定列作为df的index输出,此时index为True
chunksize: 同read_sql
dtype: 指定列的输出到数据库中的数据类型。字典形式储存:{column_name: sql_dtype}。常见的数据类型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等,具体数据类型可以参考这里
注:如果不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出,比如字符型会以sqlalchemy.types.TEXT类型输出,相比NVARCHAR,TEXT类型的数据所占的空间更大,所以一般会指定输出为NVARCHAR;而如果df的列的类型为np.int64时,将会导致无法识别并转换成INTEGER型,需要事先转换成int类型(用map,apply函数可以方便的转换)。