快速上手python操作postgresql

前言

总结下前期利用python操作postgresql数据库的笔记,方便以后使用,顺便安利markdown真舒服

文章目录

    • 前言
    • python上传dataframe数据入数据库
      • pd.to_sql上传
      • copy_from上传
    • python读取数据库数据为dataframe
      • 创建connection对象
      • pd.read_sql读取数据库
    • python操作数据库执行sql语句
      • 创建connection对象
      • 创建cursor对象
      • cursor对象执行sql语句
    • 学习链接

python上传dataframe数据入数据库

主要是通过pd.to_sql和copy_from进行数据上传

pd.to_sql上传

数据是dataframe形式则不需要新建表,直接上传即可,但是数据量很大的时候就很慢

用到的主要函数是df.to_sql()函数,跟df.to_csv()应该是一个系列的
各种数据库create_engine示例

def updata2pg(data,tablename):
    #上传数据,data是dataframe形式
    databasename='DIDIData'
    user='postgres'
    password='zrx123456'
    host='localhost'
    engine=create_engine("postgresql+psycopg2://"+user+":"+password
                         +"@"+host+":5432"+"/"+databasename)
    data.to_sql(tablename,engine,index=False,if_exists='replace')

copy_from上传

copy_from(),是postgresSQ的内置函数,适用于大量数据上传,但是需要事先建表

def updata2pg_copy(data,tablename):
    #上传数据,data是dataframe形式,否则要转换下
    con = None
    port='5432'
    databasename='DIDIData'
    user='postgres'
    password='zrx123456'
    host='localhost'
    # dataframe类型转换为IO缓冲区中的str类型
    output = StringIO()
    data.to_csv(output, sep='\t', index=False, header=False)
    output1 = output.getvalue()
    try:
        con = psycopg2.connect(dbname=databasename,user=user,
                               password=password,host=host,port=port)
        cur = con.cursor()
        cur.copy_from(StringIO(output1), tablename)
        con.commit()
    except psycopg2.DatabaseError as e:
        print('Error %s' % e)
        sys.exit(1)
    finally:
        if con:
            con.close()

python读取数据库数据为dataframe

原理是利用psycopg2.connect()建立一个connection对象,然后将connection和sql语句作为参数,进一步利用pd.read_sql获取数据库中的数据,返回类型为dataframe

创建connection对象

con = psycopg2.connect(dbname=databasename,user=user,password=password,
host=host,port=port)

psycopg2.connect()创建一个新的数据库会话(Session)并且返回一个连接对象用于连接数据库

如上面所示,其参数主要是:

  • dbname-数据库名字
  • user-数据库使用者
  • password-密码
  • host-数据库地址
  • port-数据库端口

connection对象提供了常用的数据库操作:

  • commit()-提交任何未提交的事务(transaction)到数据库
  • rollback()-回滚
  • close()-关闭数据库

pd.read_sql读取数据库

connection和sql语句是其输入参数,返回dataframe形式的数据
data=pd.read_sql(sql_command,con)

完整代码示例如下:

def get_data(sql_command,host='localhost'):
    #利用pandas获取dataframe数据
    con = None
    port='5432'
    user='postgres'
    password='zrx123456'
    databasename='DIDIData'
    try:
        con = psycopg2.connect(dbname=databasename,user=user,
                               password=password,host=host,port=port)
        data=pd.read_sql(sql_command,con)
        return data
    except psycopg2.DatabaseError as e:
        print('Error %s' % e)
        sys.exit(1)
    finally:
        if con:
            con.close()

python操作数据库执行sql语句

原理是通过connection创建cursor对象,用cursor对象操作数据库

创建connection对象

如前所述

创建cursor对象

psycopg2提供了一个cursor类,用于在psycopg2.connect()创建的session里执行postgresql命令
cursor对象由connection.cursor()方法创建

con = psycopg2.connect(dbname=databasename,user=user,
                               password=password,host=host,port=port)
cur = con.cursor()

有了cursor对象就可以操作数据库了

cursor对象执行sql语句

它主要有两个方法

  • execute(sql_query)-执行sql语句
  • fetchall()-获取所有查询结果,返回值为tuple组成的列表
cur.execute(sql_command)
con.commit()
# rows = cur.fetchall()
# for row in rows:
#     print(row)

其中

cur.execute(sql_command)是执行sql语句(此时未提交sql事务

至于sql语句这个是查询,是更新,是建表就要看sql语句怎么写了

con.commit()是提交sql事务,可以是一系列查询(此时提交sql事务
后面的fetchall()是返回sql结果(如果有返回值)有fetcall()就可以省去con.commit()
完整代码示例如下:

def execute_sql(sql_command,host='localhost'):
    #执行sql语句
    con = None
    port='5432'
    user='postgres'
    password='zrx123456'
    databasename='DIDIData'
    try:
        con = psycopg2.connect(dbname=databasename,user=user,
                               password=password,host=host,port=port)
        cur = con.cursor()
        cur.execute(sql_command)
        con.commit()
        # rows = cur.fetchall()
        # for row in rows:
        #     print(row)
    except psycopg2.DatabaseError as e:
        print('Error %s' % e)
        sys.exit(1)
    finally:
        if con:
            con.close()

学习链接

python操作postgresql
pandas链接postgresql
python百万级数据批量插入

你可能感兴趣的:(Python)