6.pymysql pandas 读写mysql数据库汇总(tcy)

pandas数据读写入MySQL数据库 2019/1/29

1.数据类型

sqlalchemy python mysql 描述
Boolean bool tinyint 布尔类型,映射到数据库中的是tinyint类型
Integer int int 整形,映射到数据库中是int类型
Float float float32 映射到数据库中是float32类型
Double   double64 双精度浮点类型
DECIMAL decimal.Decimal decimal 定点型;如用于货币计算
Date datetime.date date 日期只能存储年月日映射到数据库中是date类型
DateTime datetime.datetime datetime 日期和时间年月日时分秒毫秒
Time datetime.time time 时间时分秒
Enum str enum 枚举类型
String str varchar 字符串可变字符类型
Text str text 文本类型映射到数据库中就是text类型
LongText str longtext 长文本类型

实例:  

from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, 
                                         DECIMAL, Enum, Date, DateTime, Time, Text
from sqlalchemy.dialects.mysql import LONGTEXT

2.create_engine():  

from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://user_name:password_name@localhost3306/db_name?charset=utf8")
    
create_engine()
用途:
    创建数据库引擎,解析;建立python与mysql数据库的连接
参数:
    mysql: 指要用的数据库
    pymsql: 指需要用到python接mysql的接口程序
    user_name: 指数据库的账户
    password_name: 指数据库的密码
    localhost: 指本地地址,如果是服务器的数据库需要改为如(127.0.0.1)的类似格式
    3306: 指数据库端口
    db_name: 指数据库的名字
    charset=utf8: 指设置数据库编码方式

3函数pd.read_sql()/.DataFrame.to_sql():  

pd.read_sql(sql,con,index_col = None,coerce_float = True,params = None,
parse_dates = None,columns = None,chunksize = None)#将SQL查询或数据库表读入df
df.to_sql(name,con,schema = None,if_exists ='fail',index = True,index_label = None,
chunksize = None,dtype = None,method = None ) # 将df中的记录写入SQL数据库

参数:   

读参数:
sql : str或SQLAlchemy文本对象;查询str或表名
con : SQLAlchemy可连接(引擎/连接)或数据库字符串URI或DBAPI2连接
index_col =None: str,[str] 设置为索引的列MultiIndex
coerce_float=True : 尝试将非str,非数字值转换为浮点
params =None: list,tuple或dict传递给执行方法的参数列表。
parse_dates =None: list或dict解析为日期的列名列表。
columns =None: list读取指定列
chunksize =None: int每个块中的行数;如指定返回一个迭代器
写参数:
    name : str表名
    con :   sqlalchemy.engine.Engine或sqlite3.Connection
    schema = None:   str为None使用默认架构。
    if_exists = 'fail':    {'fail', 'replace', 'append'}表存在报错,替代,附加
    index = True:      将df索引写为列。#用index_label作为表中的列名。
    index_label = None :索引列的列标签。#index_label = None, index = True用索引名称。
                       # 如果DataFrame使用MultiIndex,则应该给出一个序列。
    chunksize = None: int, 行;#一次批量写入大小。默认所有行立即写入
    dtype :          dict列数据类型。#键是列名, 值是SQLAlchemy类型或sqlite3的字符串

    method = None : {None, ‘multi’, callable}控制使用的SQL插入子句:
                    # None:INSERT子句每行一个
                    # 'multi':在单个INSERT子句中传递多个值。
                    # callable with signature (pd    _table, conn, keys, data_iter)

===============================================================================================

数据库查询方法 2019/1/29

实例1:pymysql读数据

import pandas as pd
import pymysql

con = pymysql.connect(host='127.0.0.1', user='root', password='root', db='new_futures',
charset='utf8',use_unicode=True)
sql = 'SELECT * FROM new_futures.m1809'
df = pd.read_sql(sql, con=con)
print(df.head())
print(df.dtypes)
con.close()

'''
No name code datetime ... high low close vol
0 0 豆粕 m1809 2019-01-27 14:08:05 ... 3150.0 3000.0 3110.0 2542
1 1 豆粕 m1809 2019-01-27 14:08:05 ... 3000.0 2900.0 2950.0 1542
2 2 豆粕 m1809 2019-01-27 14:08:05 ... 3050.0 2920.0 2950.0 2470
3 3 豆粕 m1809 2019-01-27 14:08:05 ... 3150.0 3000.0 3192.0 3677

[5 rows x 11 columns]
No int64
name object
datetime datetime64[ns]
date object
time timedelta64[ns]
open float64
vol int64
......
dtype: object
'''

实例2:

import pandas as pd
import numpy as np

from sqlalchemy import create_engine
from sqlalchemy.types import Integer,CHAR
import mysql.connector
import pymysql 

pandas查询方法汇总:

pd.read_sql_table() #读表
pd.read_sql_query() #使用原始SQL进行查询
pd.has_table('table_name')#检查表是否存在
pd.io.sql.execute() #普通查询 

引擎连接:

from sqlalchemy import create_engine

engine = create_engine('postgresql://root:password@localhost:5432/db_name')
engine = create_engine('mysql+mysqldb://root:password@localhost/db_name')
engine = create_engine('oracle://root:[email protected]:1521/db_name')
engine = create_engine('mssql+pyodbc://db_name')
engine = create_engine("mysql+mysqlconnector://root:root@"
"localhost:3306/new_futures?charset=utf8")

engine = create_engine('sqlite:///db_name.db')#sqlite无主机名 相对路径
engine = create_engine('sqlite:////absolute/path/to/db_name.db')

实例2.1:架构支持

df.to_sql('table', engine, schema='other_schema') #指定其它数据库
pd.read_sql_table('table', engine, schema='other_schema')#指定其它数据库

实例2.2:pd.read_sql_table读表

pd.read_sql_table('table_name', engine)
pd.read_sql_table('table_name', engine, index_col='id') #将id指定为索引
pd.read_sql_table('table_name', engine, columns=['No', 'name'])#读2列数据
pd.read_sql_table('table_name', engine, parse_dates=['Date']) #强制将列解析为日期
pd.read_sql_table('table_name', engine,parse_dates={'Date':
{'format': '%Y-%m-%d %H:%M:%S'}})#指定日期格式字符串

实例2.3:pd.read_sql_query查询

# 可用数据库原生语句或SQLAlchemy表达式语言构造(与数据库无关)

pd.read_sql_query('SELECT * FROM data', engine)
pd.read_sql_query("SELECT id, Col_1, Col_2 FROM data WHERE id = 42;", engine)

df = pd.DataFrame(np.random.randn(20, 3), columns=list('abc'))
df.to_sql('data_chunks', engine, index=False)
for chunk in pd.read_sql_query("SELECT * FROM data_chunks",
engine, chunksize=5):#返回迭代器
print(chunk)

实例2.4:sql.execute普通查询

from pandas.io import sql
sql.execute('SELECT * FROM table_name', engine)
sql.execute('INSERT INTO table_name VALUES(?, ?, ?)', engine, params=[('id', 1, 1.2, True)])

实例2.5:SQLAlchemy.text()构造查询:查询中传入变量

import sqlalchemy as sa

pd.read_sql(sa.text('SELECT * FROM tb_name where name=:col_name'),
engine, params={'col_name': 'Tom'})#指定变量查询

===============================================================================================

pandas数据写入mysql数据库 2019/1/29

  

from sqlalchemy import create_engine
from sqlalchemy.types import Integer,CHAR

import pandas as pd
import mysql.connector

# engine0 = create_engine("mysql+pymysql://root:root@localhost:3306/new_futures?
                          charset=utf8")#127.0.0.1
engine = create_engine("mysql+mysqlconnector://root:root@localhost:3306/new_futures?
                       charset=utf8")#127.0.0.1
df=pd.DataFrame({'No':[10,11,12],'name':['Tom','Smith','Bob'],'vol'[2100,None,2300]})
print(df)

'''''''''
   No   name     vol
0  10    Tom  2100.0
1  11  Smith     NaN
2  12    Bob  2300.0
'''

实例:写入数据到数据库

# 写入数据:数据库支持可空整数

df.to_sql('m1809', con=engine,if_exists = 'append', index=False,dtype={"vol": Integer()})       
#指定数据类型,也可不指定
result=engine.execute("SELECT * FROM m1809").fetchall()#查看数据表返回元祖 用engine0会警告
pd.DataFrame(list(result))
    
pd.read_sql('m1809', con=engine)

你可能感兴趣的:(mysql)