【问题标题】:How to retrieve values with apostrophes from Sqlite如何从 Sqlite 中检索带有撇号的值
【发布时间】:2013-07-19 06:00:53
【问题描述】:

我有一个 Sqlite3 表,我正在尝试使用 Python 访问它。除了一个表列的值包含撇号(例如 George's)外,一切都运行良好。

我已经制定了 SQL

"SELECT * FROM table WHERE column1 = '" + value1 + "' and column2 = '" + value2 + "'"

value2 = George's时会出现语法错误。

什么是正确的 Python 语法?

【问题讨论】:

    标签: python sql quotes


    【解决方案1】:

    这样做的一个好方法是在查询中使用占位符来真正避免SQL injection 出现问题

    这是一个简单的例子:

    代码

    #!/usr/bin/env python
    
    import sqlite3
    
    dbc = sqlite3.connect('test.db')
    c   = dbc.cursor()
    
    name  = "george's"
    query = "select * from names where name = ?"
    
    c.execute(query, (name,))
    
    for row in c.fetchall():
        print row
    

    从数据库中输出一个包含行的元组:

    (1, u"george's")
    

    sqlite3 表:

    sqlite> .schema names
    CREATE TABLE names(id integer primary key asc, name char);
    
    sqlite> select * from names;
    1|george's
    2|dave
    3|george
    

    【讨论】:

    • 占位符不是问题,因为数据库是本地的,但它确实解决了语法问题......谢谢。
    【解决方案2】:

    第一:必填链接:Exploits of a Mom

    为了避免这种事情,您应该使用占位符。这是一个python问题,所以python回答:

    >>> import sqlite3
    >>> con = sqlite3.connect(':memory:')
    >>> cur = con.cursor()
    >>> cur.execute("select ?", ['this contains quotes: "\'"']).fetchall()
    [(u'this contains quotes: "\'"',)]
    

    不过,对于查询的非动态部分,“转义”机制是双引号:

    >>> cur.execute("select ''''").fetchall()
    [(u"'",)]
    

    ? 是 sqlite 和许多其他的占位符,但正确的占位符可能与您实际使用的数据库不同。其他常用语法是:param (PostgreSQL) 和%s (MySQL)

    【讨论】:

    • 作为一个 python 新手,这对我来说有点复杂......谢谢。
    【解决方案3】:

    使用反斜杠转义撇号。例如:

    select * from tablename where columnname='George\'s'
    

    【讨论】:

    • 用反斜杠转义,据我所知,仅限 MySQL; ANSI sql 使用''s 作为转义字符。
    • 撇号不容易访问,因为它是从另一个数据库获得的值的一部分。 value2 = "乔治的"
    • 听起来您将从另一个数据库获得的值存储在 python 变量中,然后在第二个查询中再次重用该值。并且,引号必须在第二个查询中转义。在这种情况下,搜索和替换可能会有所帮助: value2=value2.replace("'","\'")
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多