python 操作postgreSQL数据库

python 操作postgreSQL数据库

PostgreSQL 插入表数据

1.普通插入格式
INSERT INTO table_name
    (column1, column2 ... columnN)
    VALUES
    (value1, value2 ... valueN);
"INSERT INTO table_name(column1, column2 ... columnN)
VALUES ('%s','%s','%s','%s')" %(value1, value2 ... valueN)
插入变量时,用‘%s’ 要加单引号
sql = "select ctime from datanum where ctime > " + str(ptime) + " _and ctime <= " + str(current_ctime) + "_and nodeid = "+str(nodeid)
like一个变量则无法使用上面这种方法实现
2.Python脚本插入PostgreSQL表数据

Python使用Psycopg2模块的cursor类的execute()方法来插入 PostgreSQL 表数据。

cursor.execute()语法形式

该函数有两个参数,在执行成功时返回数据,否则返回 FALSE。

execute(query, vars=None)
query:必须的参数,要执行的SQL语句。
vars:要替换的SQL语句中的变量值。
count = cur.execute('select data from datanum where nodeid = %s and datatype = %s and ctime = %s', (nodeid, datatype, curctime))# count即为满足select中条件的数据条数
cur.fetchall() # 捕获所有select结果
cur.fetchone() # 捕获所有select结果中的第一条数据

PostgreSQL 连接数据库

import MySQLdb
# 打开数据库连接
db= psycopg2.connect(host="127.0.0.1", user="postgres", password="979594413", database="base_test", port="5432")
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
sql= "select/updata/insert" # 可以嵌套sql
cursor.execute(sql)
print(sql) # 多条sql语句要打印一下
# 使用 fetchone() 方法获取一条数据库。
data = cursor.fetchone()
print "Database version : %s " % data
# 关闭数据库连接
db.close()

用cur.execute()从数据库查询出来的东西,被“保存在了cur所能找到的某个地方”,要找出这些被保存的东西,需要用cur.fetchall()(或者fechone等),并且找出来之后,做为对象存在。从上面的实验探讨发现,被保存的对象是一个tuple中,里面的每个元素,都是一个一个的tuple。因此,用for循环就可以一个一个拿出来了

 cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
 python总是能够为我们着想的,在连接对象的游标方法中提供了一个参数,可以实现将读取到的数据变成字典形式,这样就提供了另外一种读取方式了

cursor 方法执行与返回值

cursor方法提供两类操作:1.执行命令,2.接收返回值 。
cursor用来执行命令的方法(mysql语句,有些或许不同)

//用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数

callproc(self, procname, args)

//执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数

execute(self, query, args)

//执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数

executemany(self, query, args)

//移动到下一个结果集

nextset(self)

cursor用来接收返回值的方法

//接收全部的返回结果行.

fetchall(self) # 元祖类型

//接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据

fetchmany(self, size=None)

//返回一条结果行

fetchone(self)

//移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条

scroll(self, value, mode='relative') 游标,

//这是一个只读属性,并返回执行execute()方法后影响的行数

rowcount

存在数据插入,不存在更新

INSERT INTO test_postgre(id,name,InputTime,age)
VALUES('1','postgre','2018-01-10 22:00:00',24)
ON conflict(id) 
DO UPDATE SET name = 'postgreOk', InputTime ='2018-02-22 12:00:00'

大于等于 9.5的版本里面 ,提供了 on conflict 功能

如果不存在则会新增,VALUES里面的值,如果存在,则会更新name和InputTime字段,当然如果你需要改age,也可以继续在后面加,或者只写age;这个conflict(id)中的id是判断是否存在记录的依据。conflict(column_name)中的column_name必须是主键或具有唯一性才可以

针对查询出来的结果集操作
CREATE OR REPLACE FUNCTION replace_into_user_pages(u_id INTEGER, p_id INTEGER, en BOOLEAN)
  RETURNS BOOLEAN AS $$
BEGIN
  IF EXISTS(SELECT id FROM user_pages WHERE user_id = u_id AND page_id = p_id)
  THEN
    UPDATE user_pages SET enabled = en WHERE user_id = u_id AND page_id = p_id;
  ELSE
    INSERT INTO user_pages (user_id, page_id, enabled) VALUES (u_id, p_id, en);
  END IF;
  RETURN TRUE;
END;
$$ LANGUAGE plpgsql;

猜你喜欢

转载自blog.csdn.net/F_Liberalism/article/details/83956694