Good day all. Lurking here has been a great help - thanks in advance. What I'd like to do is accept an input from the user, then search both the 'type' and the 'count' columns of the 'mytable' table for anything that matches the user's input.
Here's my code:
import sys
import sqlite3 as lite
for arg in sys.argv:
print arg
var = raw_input("What are you looking for: ")
print "Standby; looking for : ", var
vart = '%'+var+'%' # to add wildcards to the var string
con = lite.connect('test.db')
print
print "Ok. Here's what I found."
print
with con:
cur=con.cursor()
cur.execute( "SELECT * FROM mytable" )
# cur.execute( "SELECT * FROM mytable WHERE type LIKE ( ? )", [vart]) # this actually works - but only searches type column
# cur.execute( "SELECT * FROM mytable WHERE type LIKE ( ? ) OR WHERE count like ( ? )", [vart], [vart] ) fails
# cur.execute( "SELECT * FROM mytable WHERE type LIKE ( ? ) UNION ALL SELECT * FROM mytable WHERE count LIKE ( ?)", [vart], [vart])
rows = cur.fetchall()
# now row has each line to deal with
#print len(rows) #prints the number of lines in the db
for row in rows:
#print len(row) # prints the number of items in the list
# if var in row[0]... then print
mstr=row[0]
print mstr.encode('ascii'), row[1]
Here is the puny database:
type : count
fox|23
dog|34
cat|99
bird|123
rat|201
mouse|23
hedgehog|44
gnu|666
I was successful at searching one column only for the input string, but when I try to do both columns at once, it fails. There's got to be a way that using the sqlite3 functions and not rely on the python ones.
A valid un-nested SQL SELECT
statement only has one WHERE
statement; also, if you're passing multiple parameters to a sqlite cursor, they must be contained in a single list. The correct syntax for your code would be:
cur.execute('SELECT * FROM mytable WHERE type LIKE ( ? ) OR count like ( ? )', [vart, vart])
just a little syntax fix, and I spruced up your python to be more pep8 friendly (and closer to python3 support, although raw_input is not native in python3). From that you should be able to expand....
import sys
import sqlite3 as lite
'''
made your code more pep8 python like
note comments in python are reserved for
why not what..e.g. code is self descriptive
of what, but why is what is important
'''
print('{}'.format(sys.argv)) # debug
var = raw_input("What are you looking for: ")
print("Standby; looking for :{}".format(var))
vart = '%{}%'.format(var)
con = lite.connect('test.db')
print("\nOk. Here's what I found.\n")
with con:
cur = con.cursor()
sql_query = 'SELECT * FROM mytable WHERE type LIKE ? or count LIKE ?'
cur.execute(sql_query, ['%{0}%'.format(var), '%{0}%'.format(var)])
try:
rows = cur.fetchall()
except Exception as err:
print(err)
for row in rows:
mstr = row[0]
print('Found: {} : {}'.format(mstr.encode('ascii'), row[1]))
output examples
host-wifi:java user$ python /tmp/p.py
['/tmp/p.py']
What are you looking for: 99
Standby; looking for :99
Ok. Here's what I found.
Found: cat : 99
host-wifi:java user$ python /tmp/p.py
['/tmp/p.py']
What are you looking for: 3
Standby; looking for :3
Ok. Here's what I found.
Found: fox : 23
Found: dog : 34
Found: bird : 123
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.