【SQL】Python的数据库操作

目录

Postgres

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()

# 创建数据库
def create_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()
    
# 读取数据库
def read_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

# 仅插入若干记录
def insert_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 in range(1, 19):
    ins_outs += ', COALESCE(floor{}.ins, 0), COALESCE(floor{}.outs, 0)'.format(i, i)
    
time = 'SELECT time FROM floor1'
for i in range(2, 19):
    time += ' UNION SELECT time FROM floor{}'.format(i)

join = ''
for i in range(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)

猜你喜欢

转载自blog.csdn.net/qq_43166192/article/details/130497337