python连接PostgreSQL数据库获取数据的办法

在这里插入图片描述


一、问题

      日常,经常需要用python来连接数据库,来获取我们想要分析的一些数据,那对于数据库postgresql数据库,该怎么连接呢?

二、解决办法

      这个连接的方式,python提供了好几个库,下面就对我自己常用的两种方式,做一总结备份。

      你可能需要安装下面提到的库,安装方式很简单,pip install packagename 即可。假如速度慢的话,可以参考博主另一篇博文1**使用pip install xxxx库 命令安装速度太慢解决小妙招
**提到的方式,安装即可。

方法一:使用psycopg2库

      直接看连接方式,参数解释都在下述示例中了。

import psycopg2
# 连接参数设置
database = 'postgres' # 指定数据库名
username = 'postgres' # 指定用户名
password = '*******' # 指定用户密码 ,保密,不对外公布了,以*代替了
host = "**.**.**.**" # 指定数据库的服务器(ip)地址,同密码,保密
port = "5432" # 指定数据库端口号
gongsi_conn = psycopg2.connect(database=database,user=username,
                               password=password,host=host,port=port)
gongsi_cursor = gongsi_conn.cursor()
gongsi_cursor.execute("select * from public.table_name;")
company_data = gongsi_cursor.fetchall()  # 获取所有数据

#gongsi_conn.commit() # 提交数据,如果是查询语句,则无需用;但如果对数据库做了修改变动,则必须用(提交),不然变动信息不会在数据库中体现
#gongsi_cursor.close() # 关闭游标,select操作,也不需要手动关闭游标。
gongsi_conn.close # 关闭数据库连接

      相对来说,如果只是做select操作 ,我会更喜欢下面方法二这种方式,借用pandas库的read_sql()函数,具体看下述示例。但如果是想数据库中插入数据等要变动数据库信息的操作时,这种个人感觉则更灵活,基本和在数据库中操作语句类似,只是做了下包装而已,就相对来说更方便,可以满足更多的需求。

不倾向这种方式的原因

  1. 这种方式获取的数据,没有返回得到数据表的字段名,需要自己后续再重新指定;
  2. 结果为元组组成的列表,实际更倾向使用数据框,需要自己再做转换。

方法二:psycopg2库+pandas库

      同样,直接上示例,参数解释在对应语句后。

import psycopg2
import pandas as pd
# 连接参数设置
database = 'postgres' # 指定数据库名
username = 'postgres' # 指定用户名
password = '*******' # 指定用户密码 ,保密,不对外公布了,以*代替了
host = "**.**.**.**" # 指定数据库的服务器(ip)地址,同密码,保密
port = "5432" # 指定数据库端口号
gongsi_conn = psycopg2.connect(database=database,user=username,
                               password=password,host=host,port=port)
# 获取数据
data = pd.read_sql("select * from public.table_name;",con=gongsi_conn)
gongsi_conn.close # 关闭数据库连接

这种方式的好处在上文已说明。获取的数据就是数据框的方式存放,很方便很后续的处理。

方法三:psycopg2库+sqlalchemy库

      还看到一种与常用的从数据库取数不同的操作,即用sqlalchemy库,连接数据库后,该库也提供了具体的函数来获取数据库的数据等,后续若有再学习的需求,可参考文章2《Python中操作SQLAlchemy,SQLAlchemy中文技术文档》进一步学习,暂时作一基本了解。

import pandas as pd
import psycopg2
from sqlalchemy import create_engine

''' create_engine()里的相关参数示例和说明
    engine = create_engine('dialect+driver://username:password@host:port/database')
    
    dialect -- 数据库类型
    driver -- 数据库驱动选择
    username -- 数据库用户名
    password -- 用户密码
    host 服务器地址
    port 端口
    database 数据库
    modename 模式名称
    tablename 数据表名称
'''
# 读取 公司数据库中的wind原始数据
gongsi_engine = create_engine('postgresql+psycopg2://{username}:{password}@{host}:5432/{database}'.format(
        username=username,password=password,host=host,database=database))

# 从公司数据库读取 原始的入库 数据表
try:
    databaseData = pd.read_sql("select * from %s.%s"%(modename,tablename),con=gongsi_engine)      
except:
    print("请返回数据库,查看数据库表的字段名称是否匹配.......")

# 也可以是下面这种方式
'''
conn = gongsi_engine.connect()#表示获取到数据库连接。类似【方法一】中的cursor。
conn.execute(sql) 
'''

三、小感

      编码这种事情,除了多动手,还有去尝试对不同方法去做结合,说不定就发现,不同的方法结合起来之后,可以更省事。另外,最后也多留个心眼,看看方法的官网或者调用dir()、帮助命令等,多了解一些信息,避免被局部的使用方法而蒙蔽了自己,造成刻板的印象,以为方法只能这么用或者就是这么用的。比如sqlalchemy库,就没有去做些基础的了解,以为这个库,就是和pd.read_sql()结合使用的。实际上,其本身就可以对数据库进行很多操作,并且pd.read_sql()函数,也是可以和其他与数据建立联系的各类库结合。

在这里插入图片描述


  1. 使用pip install xxxx库 命令安装速度太慢解决小妙招 ↩︎

  2. Python中操作SQLAlchemy,SQLAlchemy中文技术文档 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_42521211/article/details/114372699