import psycopg2
# 连接数据库
conn = psycopg2.connect(database='xxxx', user='postgres', password='*****', host='127.0.0.1', port=5432)## 方式1:定义默认游标,一次性读取所有数据
cur = conn.cursor()# 执行SQL语句
cur.execute('SELECT * TABLES FROM TABLES')# 读取所有数据
data = cur.fetchall()## 方式2:定义命名游标,分批读取数据
cur = conn.cursor(name='NAME')# 执行SQL语句
cur.execute('SELECT * TABLES FROM TABLES')# 读取1000条数据
data = cursor.fetchmany(1000)
cursor.close()# 创建数据库defcreate_database(user, password, new_database):
con = psycopg2.connect(dbname='postgres', user=user, host='127.0.0.1', password=password)
con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = con.cursor()
cur.execute('CREATE DATABASE {};'.format(new_database))
cur.close()
con.close()# 读取数据库defread_SQL(database, user, password, host, port, table, cursor_factory=None):
conn = psycopg2.connect(database=database, user=user, password=password, host=host, port=port)
cur = conn.cursor(cursor_factory=cursor_factory)
cur.execute('SELECT * FROM public."{}"'.format(table))
data = cur.fetchall()
conn.commit()
conn.close()return data
# 仅插入若干记录definsert_many(database, user, password, host, port, table, data):
con = psycopg2.connect(database=database, user=user, password=password, host=host, port=port)
cur = con.cursor()
sql ='CREATE TABLE IF NOT EXISTS {} (Year int, Month int, Day int, Hour int, Temperature float)'.format(table)
cur.execute(sql)
sql ='insert into {} values(%s, %s, %s, %s, %s);'.format(table)
cur.executemany(sql, data)
con.commit()
cur.close()
con.close()
# 强烈推荐将pandas和psycopg2结合对数据库调用import psycopg2
import pandas as pd
conn = psycopg2.connect(database='database', user='postgres', password='pg123', host='127.0.0.1', port=5432)
data = pd.read_sql_query('select * from table', con=conn)
conn.close()
# 解决问题:大量表格左右关联# 方法一:使用SQL语句,繁琐的手动式join书写# 方法二:数据库存储过程# 方法三:使用python调用方法一中的语句# 方法四:使用python精简调用SQL语句(如下所示)# 建立虚拟表t,用于记录所有表的去重时间,然后使用t对所有表进行left join
ins_outs ='t.time'for i inrange(1,19):
ins_outs +=', COALESCE(floor{}.ins, 0), COALESCE(floor{}.outs, 0)'.format(i, i)
time ='SELECT time FROM floor1'for i inrange(2,19):
time +=' UNION SELECT time FROM floor{}'.format(i)
join =''for i inrange(1,19):
join +=' LEFT JOIN floor{} ON t.time = floor{}.time'.format(i, i)
sql_command ='SELECT {} FROM ({}) t {} ORDER BY t.time;'.format(ins_outs, time, join)