我有一個關于僅通過一個或多個字母搜索產品(表格)并出現我想要的列(名稱、描述和型別)的問題,但我在使用關鍵字時遇到了問題。我知道它應該是一個字串,但我想不出辦法來做到這一點。現在我有這個
@app.route('/product/<keyword>', methods=['GET'])
def product_search(kw):
logger.info('GET /product/<keyword>')
logger.debug(f'keyword: {kw}')
conn = db_connection()
cur = conn.cursor()
try:
cur.execute('SELECT id, type, name, price from product where name like s% or type like s% or description like %s', (kw,))
rows = cur.fetchall()
row = rows[0]
logger.debug('GET /product/{keyword} - parse')
logger.debug(row)
content = {'id': int(row[0]), 'type': row[1], 'name': row[2], 'price': row[3], 'description': row[5]}
response = {'status': StatusCodes['success'], 'results': content}
except (Exception, psycopg2.DatabaseError) as error:
logger.error(f'GET /product/{keyword} - error: {error}')
response = {'status': StatusCodes['internal_error'], 'results': str(error)}
finally:
if conn is not None:
conn.close()
return flask.jsonify(response)
我也想知道我是否可以做到
cur.execute('SELECT id, type, name, price from product where name like s% or type like s% or description like s%
%s', (kw,))
一種基本上執行程式的方法,但例如使用字母 c 搜索可樂之類的產品
'SELECT id, type, name, price from product where name like '%c' or type like '%c' or description like '%c%'
換句話說,我希望它的名稱和型別按第一個字母和句子中間的描述進行搜索。
uj5u.com熱心網友回復:
在 Python 中將值插入 SQL 查詢的正確方法是使用引數替換,正如您已經在做的那樣,例如:
values = ('Alice', 'Bob')
cur.execute("""SELECT name FROM tbl WHERE name = %s OR name = %s""", values)
連接器正確參考了這些值,以最大限度地減少錯誤和SQL 注入的風險。使用字串格式化技術來做到這一點很容易出錯,不推薦使用。
要處理LIKE查詢的值,您需要將“%”字符附加或前置到值,如下所示:
values = (kw '%',)
cur.execute("""SELECT id, type, name, price from product where name like %s""", values)
如果你想在多個地方使用相同的值,你可以使用值的字典而不是元組:
values = {'kw': kw '%', 'kw2': '%' kw '%'}
cur.execute("""SELECT id, type, name, price from product where name like %(kw)s or type like %(kw)s or description like %(kw2)s""", values)
請注意,可以使用字串格式自行構建值,如下所示
values = (f'{kw}%',)
cur.execute(sql, values)
但是使用字串格式將值放入查詢本身是不行的:
# Not OK
cur.execute(f"""SELECT * FROM tbl WHERE name = {kw}""")
uj5u.com熱心網友回復:
您應該在函式輸入引數中使用與 url 相同的名稱,如果您這樣做,它將已經是 str :
@app.route('/product/<keyword>', methods=['GET'])
def product_search(keyword):
print(type(keyword)) # <class 'str'>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384220.html
標籤:Python PostgreSQL的 psycopg2
