python如何操作SQL语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何操作SQL语句相关的知识,希望对你有一定的参考价值。

参考技术A 这里有个比较清楚的解答:
http://zhidao.baidu.com/question/262503775.html
但是你的是一个文本的话,就要稍微改一下咯
如果改成cx_Oracle的话,就是这样的:
import
sys
import
cx_Oracle
import
os
class
handleDataBase:
def
__init__(self,user,passwd,server,sql):
self.user=user
self.passwd=passwd
self.server=server
self.sql=sql
self.conn
=
cx_Oracle.connect("%s/%s@%s"%(self.user,self.passwd,self.server))
def
selectDB(self):
cursor
=
self.conn.cursor()
cursor.execute("select
count(1)
from
search_item_08")
ret
=
cursor.fetchall()
cursor.close()
print
ret
return
ret
def
closeDB(self):
self.conn.close()
if
__name__
==
"__main__":
if
len(sys.argv)
<
4:
print
"Need
Arguments:
user
passwd
server"
sys.exit(1)
user=sys.argv[1]
passwd=sys.argv[2]
server=sys.argv[3]
#sql='select
count(1)
from
search_item_08;'
#注意这里要改
sql
=
open('a.sql','r').read()
#改成从文件读取
#接下来就访问数据库了
handleDB
=
handleDataBase(user,passwd,server,sql)
handleDB.selectDB()
handleDB.closeDB()

如何在 Python 中检查和执行 SQL 语句

【中文标题】如何在 Python 中检查和执行 SQL 语句【英文标题】:How to check and perform SQL statements in Python 【发布时间】:2012-02-11 01:14:18 【问题描述】:

我在 Python 中使用 MySQLdb。有人告诉我,要正确创建 SQL 语句并避免 SQL 注入攻击,我应该编写如下代码:

sql = "insert into table VALUES ( %s, %s, %s )"
args = var1, var2, var3
cursor.execute( sql, args )

或者:

cursor.execute( "insert into table VALUES ( %s, %s, %s )", var1, var2, var3 )

甚至这个(这可能是错误的):

header = ( 'id', 'first_name', 'last_name' )
values = ( '12', 'bob'       , 'smith'     )
cursor.execute( "insert into table ( %s ) values ( %s )", ( header + values ) )

当我用 PHP 编程时,我通常会将整个 SQL 语句存储为一个长字符串,然后执行该字符串。类似于(使用 PostgreSQL):

$id         = db_prep_string( pg_escape_string( $id         ) );
$first_name = db_prep_string( pg_escape_string( $first_name ) );
$last_name  = db_prep_string( pg_escape_string( $last_name  ) );

$query = "insert into table ( id, first_name, last_name ) values ( $id, $first_name, $last_name )"

$result = pg_query( $con, $query );
$retval = pg_fetch_array( $result );

db_prep_string 在哪里

function db_prep_string( $value ) 
    if( 
        !isset( $value ) ||
        (is_null($value)) ||
        preg_match( '/^\s+$/', $value ) ||
        ( $value == '' )
     ) 
    $value = 'null';

else 
    $value = "'$value'";

    return $value;

然后进行调试,我可以简单地回显$query 以查看整个 SQL 语句。我可以用 Python 做类似的事情吗?换句话说,我可以将safe SQL语句存储为字符串,打印出来调试,然后执行吗?

我想做这样的事情:

id         = prevent_sql_injection_string( id         )
first_name = prevent_sql_injection_string( first_name )
last_name  = prevent_sql_injection_string( last_name  )

sql  = "insert into table ( id, first_name, last_name ) values "
sql += id         + ", "
sql += first_name + ", "
sql += last_name

print sql #for debugging

cursor.execute( sql )        

如果没有,那我如何在 Python 中查看完整的 SQL 语句?

额外问题:如何使用 Python 在 SQL 语句中输入空值?

【问题讨论】:

这使用“参数化”查询或 SQL 调用。 如果要输入空值,请使用None 您在 pgsql 查询中嵌入了参数以获得一个巨大的字符串?呸!即使在 PHP 中,您也可以使用 pg_query_params 将查询与值分开。 我最初认为我喜欢将 SQL 查询存储为长字符串,这样我就可以获取该字符串并手动将其作为 mysql 上的命令输入。在阅读了一些 cmets 和答案之后,似乎我应该使用带有元组和 , 符号的参数化查询(请原谅我的模糊描述)。我不介意这样做,但是调试 SQL 查询的最佳做法是什么? _last_executed 光标属性看起来很有希望,正如这个 SO 答案中提到的:***.com/a/7190914/4970 【参考方案1】:

查看Python Database API specification,因为它回答了您的一些问题。例如,对于 NULL 值,API 规范是这样说的:

SQL NULL 值由 Python None 单例表示 输入输出。

在参数样式方面,规范为实现者提供了多个选项,包括 MySQLdb 使用的'format' 选项。

如果您想查看 MySQLdb 将对您的数据库执行什么查询,您可以稍微作弊并使用连接 literal(...) 方法。例如:

>>> import MySQLdb
>>> db = MySQLdb.connect(...)
>>> print "insert into table VALUES ( %s, %s, %s )" % db.literal((5, "ab'c", None))
insert into table VALUES ( 5, 'ab\\'c', NULL )

但是db.literal(...) 方法并不真正打算供 MySQLdb 模块的客户端使用,所以不要将它放在生产代码中。

另外,请注意MySQLdb documentation 对参数有这样的说法:

参数占位符只能用于插入列值。它们不能用于 SQL 的其他部分,例如表名、语句等。

因此,请注意不要在插入语句中使用参数占位符作为表的列名。

【讨论】:

【参考方案2】:

您想要执行的代码是有效的。您可以执行以下操作:

def prevent_sql_injection_string( value ):
    if (value is None or str(value).strip()=''):
        value = 'null'
    else:
        value = "'%s'" % str(value)
    return value    

# convert inputs
id         = prevent_sql_injection_string( id         )
first_name = prevent_sql_injection_string( first_name )
last_name  = prevent_sql_injection_string( last_name  )

# construct query
# Note: "some formatted string" % (value,value,value) syntax is like doing
# printf("some formatted string",value,value,value)
sql = "insert into table (id, first_name, last_name ) values (%s, %s, %s)" 
         % (id,first_name,last_name)

# print
print sql

# execute
cursor.execute(sql)

【讨论】:

没有人应该这样做! 您的代码格式似乎错误(以: 结尾的第一行之后没有缩进块)。另外,我看不出这如何阻止任何事情。如果我保护的字符串中有一个单引号怎么办?你所做的只是添加单引号,所以如果我的值是"'; drop table foo",那不会引起问题吗? 如果您要投反对票,请解释为什么不这样做 - 我很好奇,真的很想知道。 谢谢@BryanOakley,忘记了那里的额外行 - 已修复(我刚刚将 OP 的代码翻译成 Python - PHP pg_escape_string 是否也能防止 "';drop table foo" 之类的事情?)跨度>

以上是关于python如何操作SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作文件模拟SQL语句功能

Python入门 Day3-模拟sql语句操作

python操作excel转换为sql语句

Python操作文件模拟SQL语句功能

Mybatis 是如何操作 sql 语句的

Python3:sqlalchemy对mysql数据库操作,非sql语句