数据库链接,ETL

一、python通过pip安装包,提示 pip 不是内部或外部命令

1、执行pip install pymysql,报pip不是内部或者外部命令

2、需要将该命令加入到环境变量中,找到该命令所在的路径

3、右击我的电脑-->属性-->高级-->环境变量-->系统变量-->path,添加上pip所在的路径

4、但是依旧报上面的错,这次错在哪里呢?

原来是配置完成后,需要重新关闭命令窗口,重新打开配置的变量才会生效。

D:\Users\Administrator\Anaconda3\Scripts;

D:\Users\Administrator\Anaconda3;

D:\Users\Administrator\Anaconda3\Library\bin

安装好驱动程序:连接数据库

二、原始数据库操作

1、导入包

import pymysql

2、连接数据库

建立连接

conn=pymysql.connect(

    host = '127.0.0.1',

    user = 'root',

    password = '123456',

    db = 'gansu',

    port =  3306,

    charset = 'utf8'

)

建立游标

cur = conn.cursor()

3、查询,得到的结果放在内存里

cur.execute('select * from bas_calcedvisit where CITY = "包头"')

4、获取数据,元组形式

data = cur.fetchall()

5、打印数据查看

for d in data:

    print(d[21],d[22],d[23],d[24])

6、对数据库进行增删改后,必须提交

conn.commit()

7、执行完之后需要将其关闭

cur.close()

conn.close()

三、pandas读数据库

1、加载包

import pymysql

import pandas as pd

from sqlalchemy import create_engine

2、连接、查询

sql = 'select * from bas_calcedvisit'

engine = create_engine('mysql+pymysql://root:123456@localhost:3306/gansu?charset=utf8')

df = pd.read_sql(sql,engine)

3、自定义函数

注意:这里的数据库名写成一个参数形式,则用{0}代替,后面加上.format(参数名),若多个参数,依次是{1},{2}....,后面.format(参数名1,参数名2,....)

def reader(query,db = 'gansu'):

    sql = query

    engine = create_engine('mysql+pymysql://root:123456@localhost:3306/{0}?charset=utf8'.format(db))

    df = pd.read_sql(sql,engine)

    return df

调用函数

df_data=reader( 'select * from bas_calcedvisit')

插入数据

df_data1=reader('select * from bas_calcedvisit where CHANNELDISPLAYNAME = "直接访问"')

数据框:

这里有个问题,如何统计出形如sql中查询数据呢

SELECT CITY,COUNT(DISTINCT UVCOOKIE),COUNT(DISTINCT SESSIONID),COUNT(ID) FROM bas_calcedvisit

WHERE CHANNELDISPLAYNAME = '直接访问'

GROUP BY CITY


result = df_data1.groupby('CITY').count()['UVCOOKIE'].reset_index()

插入表:(注意,一般都是先建表,然后插入数据,这样有自增字段)

(其中if_exists='append'时,如果表存在,则会追加数据,如果表不存在,则先新建表)

result.to_sql(name = 'newtable',con = 'mysql+pymysql://root:123456@localhost:3306/gansu?charset=utf8',if_exists='append',index = False )

你可能感兴趣的:(数据库链接,ETL)