python sqlite3无法执行有效的sqlite3命令

时间:2017-03-30 19:16:07

标签: python sqlite

我觉得这很明显,但是当我在sqlite3中运行命令时没关系,但是我从python sqlite3运行相同的命令它不起作用。

架构:

sqlite> .schema transcriptionUnit
CREATE TABLE "transcriptionUnit" (
    id INTEGER NOT NULL,
    name VARCHAR NOT NULL,
    PRIMARY KEY (id)
);

Python函数:

def getValue(path2db, tableName, columnName, findColumn, findValue):
    import sqlite3
    db = sqlite3.connect(path2db)
    cursor = db.cursor()
    query = 'SELECT '+columnName+' FROM '+tableName+' WHERE '+findColumn+' = '+findValue
    print(query)
    cursor.execute(query)
    all_rows = cursor.fetchall()
    db.close()

    return all_rows

sqlite3中的命令:

sqlite> select id from transcriptionUnit where name = 'TU_001';
1

ipython中的命令:

In [13]: db_funcs.getValue('/home/oli/Dropbox/Documents/PhD/wc-model-docs/geneLabels/gene_db/gene_db.db','transcriptionUnit', 'id', 'name', 'TU_001')
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
<ipython-input-13-1797c506d95e> in <module>()
----> 1 db_funcs.getValue('/home/oli/Dropbox/Documents/PhD/wc-model-docs/geneLabels/gene_db/gene_db.db','transcriptionUnit', 'id', 'name', 'TU_001')

/home/oli/Dropbox/Documents/PhD/wc-model-docs/geneLabels/gene_db/python/read_db_funcs.pyc in getValue(path2db, tableName, columnName, findColumn, findValue)
 19         cursor = db.cursor()
 20         query = 'SELECT '+columnName+' FROM '+tableName+' WHERE '+findColumn+' = '+findValue
---> 21         cursor.execute(query)
 22         all_rows = cursor.fetchall()
 23         db.close()

OperationalError: no such column: TU_001

只是为了表明该功能通常有效:

In [15]: db_funcs.getValue('/home/oli/Dropbox/Documents/PhD/wc-model-docs/geneLabels/gene_db/gene_db.db','transcriptionUnit', 'name', 'id', str(1))
Out[15]: [(u'TU_001',)]

我的大脑现在正在思考这个问题,所以任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

在SQL中,必须引用字符串。您使用sqlite3中的命令执行此操作,但在使用Python构建命令时则不行。

但是为了避免像这样的字符串格式化问题(和SQL注入攻击),更好地使用参数(仅适用于值,而不适用于表/列名称):

query = 'SELECT '+columnName+' FROM '+tableName+' WHERE '+findColumn+' = ?'
cursor.execute(query, [findValue])