zoukankan      html  css  js  c++  java
  • psycopg2 (python与postgresql)

    #快速导入数据到postgresql

    import pandas as pd 

    import psycopg2

    from io import StringIO 

    def sql_to_df():

        con=pymysql.connect(**conf["mysql_form"])

        sql="select category_id,name,gameid,img_url from category where category_id in (11665,9653,6504) "

        try:

            with con.cursor() as cur:

                cur.execute(sql)

                datas=cur.fetchall()

        finally:

            con.close()

        df=pd.DataFrame(list(datas))

        return df

    def df_to_pg(df=None,db="spider",table='price_730'):

        #这里生成的StringIO类似于file文件,可read,可write,不同的是file是在硬盘上的文件,而StringIO是在内存中的文件

        output=StringIO()

        #也可以直接将字符串转换成内存文件 ,

        #将数据保存到‘文件’

        if not df :

            df=sql_to_df()

        df.to_csv(output,sep=' ',index=False,header=False)

        #使文件定位到第一个字符

        output.seek(0)

        try:

            conn=psycopg2.connect(database=db,**conf["postgres"])

            cur=conn.cursor()

            cur.copy_from(output,table,null='')

            conn.commit()

            result=cur.rowcount

        finally:

            cur.close()

            conn.close()

        return result

    if __name__=='__main__':

     # df=pd.read_csv('e:/730_price.csv')

     print(df_to_pg(table="category"))

    建立连接

    使用*.ini文件(python的configparser包可以解析这种类型的配置文件)保存数据库连接的配置信息。

    使用psycopg2.connect函数获得connection对象。

    使用connection对象创建cursor对象。

    使用cursor对象执行sql语句提交或者回滚transaction。

    使用cursor对象fetchone获得查询结果。

    关闭cursor对象和connection对象。

    创建数据表

    过程:

    构造建表的sql语句

    调用psycopg2.connect()方法获得connection对象

    调用connection.cursor()方法获得cursor对象

    调用cursor.execute()方法执行sql语句

    调用connection.commit方法提交事务

    调用cursor.close()和connection.close()方法关闭连接

    插入行

    构造插入语句, 使用%s作为占位符,执行时psycopg2会用值智能替换掉占位符。可以添加RETURNING字句,来得到自动生成的字段值。

    同创建数据表的2,3。获得connection对象和cursor对象

    使用cursor.execute方法来插入一行,使用cursor.executemany方法来插入多行。 execute方法的第一个参数是sql语句,第二个参数是值的tuple。executemany方法的第一个参数是sql语句,第二个参数是list of tuple。

    如果在1中使用了RETURNING子句,可以使用cursor.fetchone方法,来获得返回的自动生成字段的值。

    同上5

    同上6

    更新数据

    基本上和插入行相同。

    使用cursor.rowcount属性来获得受影响的行的数目。

    transaction

    connection对象负责管理事务。当你第一次使用cursor.execute方法执行sql语句的时候事务开启,这以后的所有sql语句都在这个事务中执行,直到connection.commit或者connection.rollback或者del connection或者connection.close被调用,事务才结束。

    一个简单的select语句可能会开启一个事务并且对相应的表格加锁,所以如果你是在开发一个长时间运行的应用,而且一个连接长时间不使用,那么你需要调用commit或者rollback方法结束事务,避免不必要的问题。

    使用connection.autocommit来控制事务

    从psycopg2.5开始,connection和cursor都是context manager对象,可以在with ... as ...语句中使用。值得注意的是,离开with语句后,connection对象不会被close,它只是结束提交或者回滚事务。所以可以在多个with语句中使用connection对象。

    调用存储过程

    使用cursor.callproc('function name', tuple), 函数的第一个参数是存储过程的名字,函数的第二个参数是实参tuple。这个调用和cursor.execute('select * from functionanme(%s)', tuple)相同。

    可以使用cursor.fetchone, cursor.fetchmany, cursor.fetchall来获得返回值。

    blob对象

    使用psycopg2.Binary对象和postgresql的BYTEA数据类型对应,用于存储二进制数据。

    以下这个例子演示了二进制数据的存取。

    config.py

    de  >

    def config():

        db_conn_config = {

            'host': 'localhost',

            'user': 'postgres',

            'password': '',

            'dbname': 'test',

            'port': 5432

        }

        return db_conn_config

        de>

    write_blob.py

    de  >

    import psycopg2

    from config import config

    def write_blob(path_to_file):

        """ insert a BLOB into a table """

        conn = None

        try:

            # read data from a picture

            drawing = open(path_to_file, 'rb').read()

            # read database configuration

            params = config()

            # connect to the PostgresQL database

            conn = psycopg2.connect(**params)

            # create a new cursor object

            cur = conn.cursor()

            # execute the INSERT statement

            cur.execute("INSERT INTO parts_drawings(drawing_data,name) " +

                        "VALUES(%s,%s)",

                        (psycopg2.Binary(drawing), path_to_file))

            # commit the changes to the database

            conn.commit()

            # close the communication with the PostgresQL database

            cur.close()

        except (Exception, psycopg2.DatabaseError) as error:

            print(error)

        finally:

            if conn is not None:

                conn.close()

    if __name__ == '__main__':

        write_blob('./1.jpg')de>

    read_blob.py

    de  >

    from config import config

    import psycopg2

    def read_blob(id, path_to_dir):

        """ read BLOB data from a table """

        conn = None

        try:

            # read database configuration

            params = config()

            # connect to the PostgresQL database

            conn = psycopg2.connect(**params)

            # create a new cursor object

            cur = conn.cursor()

            # execute the SELECT statement

            cur.execute(""" SELECT *

                            FROM parts_drawings                        

                            WHERE id = %s """,

                        (id,))

            blob = cur.fetchone()

            open(path_to_dir + str(blob[0]) + '.jpg', 'wb').write(blob[1])

            # close the communication with the PostgresQL database

            cur.close()

        except (Exception, psycopg2.DatabaseError) as error:

            print(error)

        finally:

            if conn is not None:

                conn.close()

    if __name__ == '__main__':

        read_blob(1, './img/')

    de>

    查询数据

    查询数据和其它操作类似。

    可以使用cursor.fetchone, cursor.fetchall, cursor.fetchmany(size=cursor.arraysize)方法来返回查询结果。fetchone返回一个tuple或者None, fetchall返回一个list of tuple,如果没有结果则返回一个空的tuple。fetchmany返回list of tuple, list的长度由size参数决定,size的默认值是cursor.arraysize, 如果没有结果可以返回,那么返回一个空的list。

    删除数据

    和更新数据类似

    可以使用cursor.rowcount来获得删除的行数目。

  • 相关阅读:
    Xcode的控制台调试命令
    android 分辨率自适应
    android 分辨率自适应
    android屏幕适配
    android屏幕适配
    最新版本的ADT使用问题
    最新版本的ADT使用问题
    UVa 1639 Candy (数学期望+组合数学+高精度存储)
    UVa 12230 && HDU 3232 Crossing Rivers (数学期望水题)
    HDU 1087 Super Jumping! Jumping! Jumping! (DP+LIS)
  • 原文地址:https://www.cnblogs.com/Ting-light/p/9546771.html
Copyright © 2011-2022 走看看