总结下前期利用python操作postgresql数据库的笔记,方便以后使用,顺便安利markdown真舒服
主要是通过pd.to_sql和copy_from进行数据上传
数据是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(),是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()
原理是利用psycopg2.connect()建立一个connection对象,然后将connection和sql语句作为参数,进一步利用pd.read_sql获取数据库中的数据,返回类型为dataframe
con = psycopg2.connect(dbname=databasename,user=user,password=password,
host=host,port=port)
psycopg2.connect()创建一个新的数据库会话(Session)并且返回一个连接对象用于连接数据库
如上面所示,其参数主要是:
connection对象提供了常用的数据库操作:
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()
原理是通过connection创建cursor对象,用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对象就可以操作数据库了
它主要有两个方法
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百万级数据批量插入