python数据导入(连接)数据库数据的简单方法

 python数据导入数据库的方法:


一种是导入sqlalchemy包,另一种是导入psycopg2包。
具体用法如下(此处以postgre数据库举例)

第一种:

# 导入包
from sqlalchemy import create_engine
import pandas as pd
from string import Template
# 初始化引擎
engine = create_engine('postgresql+psycopg2://' + pg_username + ':' + pg_password + '@' + pg_host + ':' + str(
    pg_port) + '/' + pg_database)
query_sql = """
      select * from $arg1
      """
query_sql = Template(query_sql) # template方法

df = pd.read_sql_query(query_sql .substitute(arg1=tablename),engine) # 配合pandas的方法读取数据库值
# 配合pandas的to_sql方法使用十分方便(dataframe对象直接入库)
df.to_sql(table, engine, if_exists='replace', index=False) #覆盖入库
df.to_sql(table, engine, if_exists='append', index=False)  #增量入库

 create_engine()括号内的书写方法:

"""
MySQL-Python
    mysql+mysqldb://:@[:]/
  
pymysql
    mysql+pymysql://:@/[?]
  
MySQL-Connector
    mysql+mysqlconnector://:@[:]/
  
cx_Oracle
    oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
"""

将数据写入数据库的方法 ————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()等,具体数据类型可以参考这里
还是以写到mysql数据库为例:

 

import pandas as pd  
from sqlalchemy import create_engine  
conn = create_engine('mysql+pymysql://root:password@localhost:3306/databasename?charset=utf8')  
df = pd.DataFrame() 
df["A"] = [1,2,3,4]  
df["B"] = [11,22,33,44]  
df.to_sql('表名',con=engine,if_exists='replace/append/fail',index=False)  #往数据库里写入数据

**注:**如果不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出,比如字符型会以sqlalchemy.types.TEXT类型输出,相比NVARCHAR,TEXT类型的数据所占的空间更大,所以一般会指定输出为NVARCHAR;而如果df的列的类型为np.int64时,将会导致无法识别并转换成INTEGER型,需要事先转换成int类型(用map,apply函数可以方便的转换)。

#第二种方法,与jdbc使用极为相似

# 导入包
import psycopg2
# 初始化
conn = psycopg2.connect(database = database, user = username, password = passwd, host = host, port = port)
cursor = conn.cursor()
# 执行sql
cursor.execute(sql, values)  # 与jdbc的prepareStatement极为类似,执行的是一个具体的sql语句。
cursor也能调存储过程,并且获取返回值。

 

python读取数据库方法:

import pymysql
import pandas as pd
cont = pymysql.connect(host='localhost', user='root', passwd='19941103', db='lession', port=3306, charset='utf8')
inter_distance = pd.read_sql('select * from inter_distance order by distance ASC ', con=cont)
cont.close()
# 此处的cont可以换成上文中的
# conn = create_engine('mysql+pymysql://root:password@localhost:3306/databasename?

navicat导入数据出现中文乱码

1.问题描述:

       excel转为csv后,导入英文时没错。但中文就是显示的乱码。

2.解决方法:

       将csv用记事本打开,调整编码格式为UTF-8, 点击保存覆盖掉原文件,然后再 导入,乱码问题就解决


 

你可能感兴趣的:(mysql)