Python SQLite如何使用'?'进行部分搜索?占位符

时间:2015-04-24 14:11:54

标签: python sqlite

说我的查询如下:

q = SELECT * FROM MY_TABLE WHERE FIELD LIKE ?
cursor.execute(q, some_query_value)

这似乎没有进行“包含”搜索,所以我试着这样做

q = SELECT * FROM MY_TABLE WHERE FIELD LIKE %?%
cursor.execute(q, some_query_value)

但是python似乎并不喜欢这个。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

%通配符是要插值的值的一部分;使用字符串连接或格式将其添加到要搜索的值中,而不是在查询中:

q = "SELECT * FROM MY_TABLE WHERE FIELD LIKE ?"
cursor.execute(q, ('%' + some_query_value + '%',))

q = "SELECT * FROM MY_TABLE WHERE FIELD LIKE ?"
cursor.execute(q, ('%{}%'.format(some_query_value),))

现在sqlite3可以正确引用带通配符的值进行插值。

答案 1 :(得分:5)

尝试在查询字符串周围添加引号并在查询值中放置通配符:

TID: [0] [ESB] [2015-04-24 09:18:31,100] ERROR {org.apache.synapse.transport.passthru.util.RelayUtils} -  Error while building Passthrough stream {org.apache.synapse.transport.passthru.util.RelayUtils}
org.apache.axiom.om.OMException: javax.xml.stream.XMLStreamException: DOCTYPE is not allowed
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
    at org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:109)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:570)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:566)
    at org.apache.axis2.builder.ApplicationXMLBuilder.processDocument(ApplicationXMLBuilder.java:81)
    at org.apache.synapse.transport.passthru.util.DeferredMessageBuilder.getDocument(DeferredMessageBuilder.java:118)
    at org.apache.synapse.transport.passthru.util.RelayUtils.builldMessage(RelayUtils.java:116)
    at org.apache.synapse.transport.passthru.util.RelayUtils.buildMessage(RelayUtils.java:91)
    at org.apache.synapse.transport.passthru.util.TraceMessageBuilderDispatchHandler.build(TraceMessageBuilderDispatchHandler.java:73)
    at org.apache.synapse.transport.passthru.util.TraceMessageBuilderDispatchHandler.invoke(TraceMessageBuilderDispatchHandler.java:64)
    at org.apache.axis2.engine.Phase.invokeHandler(Phase.java:340)
    at org.apache.axis2.engine.Phase.invoke(Phase.java:313)
    at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:261)

答案 2 :(得分:2)

这是一个独立的示例,演示如何使用通配符进行查询。

import sqlite3

conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('create table methodists (name text)')

c.executemany("insert into methodists VALUES (?)",
              [['George Lucas'], ['George W. Bush'], ['W. C. Handy']])

c.execute('select name from  methodists where name like ?', ['George%'])
print ', '.join(name for name, in c.fetchall())

c.execute('select name from methodists where name like ?', ['%W.%'])
print ', '.join(name for name, in c.fetchall())

结果:

George Lucas, George W. Bush
George W. Bush, W. C. Handy