psycopg postgresql 第一次整理

本文介绍了如何使用Python的Psycopg2库连接和操作PostgreSQL数据库,包括连接建立、游标操作、事务处理和占位符的使用。同时,文章提到了SQL注入问题以及参数化查询的正确做法。此外,还讨论了Python与SQL数据类型的对应、字符串处理和二进制适应。在常见问题部分,强调了事务管理、命令行参数传递和日志记录,还提供了PostgreSQL的安装和使用指南。
摘要由CSDN通过智能技术生成

Psycopg2用法及实现

导包 import psycopg2

获取连接:conn = psycopg2.connect(dsn)

dsn 为一个字符串,k-v形式用空格连起来 :dbname=xx user=xx port=xx password=xx ..

获取游标对象来操作数据库:cur = conn.cursor()

操作数据库:cur .execute("sql语句") 如果是创建、插入、更新则直接commit,如果是select语句则使用fetchxx来获取

操作数据库:cur.execute("select * from table")

获取查询结果单一:single_back = cur.fetchone()

获取查询结果list:list_back = cur.fetchall()

提交或者回滚来结束事务

提交:conn.commit()

回滚:conn.rollback()

占位

psycopg中只有%s,无论是数字还是字符串都是%s。

cur.execute("delete from grade_table where name = '%s' " % (name)) 语法可行,但是会造成sql注入

sql = "delete from grade_table where name = %s" % ("'ff' ;delete from grade_table;") SQL INJECTION

sql = "delete from grade_table where name = '%s'" % ("ff' or 'a'='a") SQL INJECTION

cur.execute()只接受序列:元祖和字典

元祖形式:cur.execute("""insert into table (name,age)values(%s,%s)""",(“名字”,12))如果是单个占位,则(value,) 只接收序列

字典形式(命名参数):cur.execute("""insert into table (name,age)values(%(name)s,%(age)s)""",{'name':name,'age':12})

*动态生成sql查询(文档举例) format

cur.execute("INSERT INTO %s VALUES (%s)", ('numbers', 10)) WRONG

cur.execute(SQL("INSERT INTO {} VALUES (%s)").format(Identifier('numbers')),(10,)) Correct

查询参数注意点

字符串有双引号隔开,则单引号可以不使用,占位符也不要使用%相连

SQL = "INSERT INTO authors (name) VALUES (%s);" Note: no quotes. %s这里不要使用引号,psycopg2会自动加

data = ("O'Reilly", )

cur.execute(SQL, data) Note: no % operator 不要使用%相连,和python语法不一样

python中和sql中数据类型的适用

python:-None-True-False

sql:------NUll-- true-false

python中整数类型int--浮点数类型float--用户定义(标度,精度)Decimal > 数据库中numerical

编码和unicode处理和二进制适应 todo

字符串:发送:字符串在发送之后,到达后端之前会自动编码cncoding,不能编码会报错。python3接收的是字符串,python2接收的是unicode串

unicode:psycopg可以和PostgreSQL交换Unicode数据。接收的时候python3自动解码,python2是数据库客户端编码的8位二进制数据字符串对象,必须注册类型转换器才能接受unicode对象

二进制:python2中,如果str是二进制数据,使用psycopg2.Binary(二进制数据)来传递给字段

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值