8 python mysql sql database sqlite
我正在尝试将从文件中读取的字符串插入到sqlite
Python中的数据库中.字符串具有空格(换行符,制表符和空格),并且还具有单引号或双引号的外观.这是我尝试这样做的方式:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
# Create table
c.execute('''CREATE TABLE test
(a text, b text)''')
f = open("foo", "w")
f.write("hello\n\'world\'\n")
f.close()
testfield = open("foo").read()
# Insert a row of data
c.execute("INSERT INTO test VALUES ('%s', 'bar')" %(testfield))
# Save (commit) the changes
conn.commit()
Run Code Online (Sandbox Code Playgroud)
我发现这失败了,错误:
c.execute("INSERT INTO test VALUES ('%s', 'bar')" %(testfield))
sqlite3.OperationalError: near "world": syntax error
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?在插入数据库之前是否需要对字符串进行转义,如果是这样的话?谢谢.
Mar*_*ers 19
您使用SQL参数而不是字符串格式:
c.execute("INSERT INTO test VALUES (?, 'bar')", (testfield,))
Run Code Online (Sandbox Code Playgroud)
使用SQL参数时,让数据库库处理引用,甚至更好,让数据库优化查询并重用优化的查询计划,以便对同一基本查询(具有不同参数)进行多次执行.
最后但并非最不重要的是,您可以更好地防范SQL注入攻击,因为数据库库最了解如何逃避危险的类似SQL的值.
引用sqlite3文档:
通常,您的SQL操作需要使用Python变量中的值.你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的; 它使您的程序容易受到SQL注入攻击(请参阅http://xkcd.com/327/以获取可能出错的幽默示例).
而是使用DB-API的参数替换.
?
在任何想要使用值的位置放置占位符,然后提供值元组作为游标execute()
方法的第二个参数.
归档时间: |
|
查看次数: |
12027 次 |
最近记录: |