Как мне вернуть все значения строк значения данных, которые я ввел в качестве аргумента в функцию поиска при использовании postgresql с python

#python #postgresql

#python #postgresql

Вопрос:

         import psycopg2
        
        def connect_table():
            connect= psycopg2.connect("dbname= 'bookshop' user='postgres' password='0973' host='localhost' port='5432'")
            cursor= connect.cursor()    
            cursor.execute("CREATE TABLE IF NOT EXISTS books (ID SERIAL PRIMARY KEY, Title TEXT, Author TEXT, Year INTEGER, ISBN INTEGER UNIQUE)")
            connect.commit()     
            connect.close()
    
    def insert(Title,Author,Year,ISBN):
        connect= psycopg2.connect("dbname= 'bookshop' user='postgres' password='0973' host='localhost' port='5432'")
        cursor= connect.cursor() 
        cursor.execute("INSERT INTO books (Title, Author, Year, ISBN) VALUES (%s,%s,%s,%s)", (Title,Author,Year,ISBN))
        connect.commit()     
        connect.close()
    
    
    def view():
        connect= psycopg2.connect("dbname= 'bookshop' user='postgres' password='0973' host='localhost' port='5432'")
        cursor= connect.cursor()
        cursor.execute("SELECT * from books")
        rows= cursor.fetchall()      #Fetches all rows of a query result, returns it as a list of tuples
        connect.close()
        return rows
    
    def search(Title='',Author='',Year='',ISBN=''):
        connect= psycopg2.connect("dbname= 'bookshop' user='postgres' password='0973' host='localhost' port='5432'")
        cursor= connect.cursor()
        cursor.execute("SELECT * from books WHERE Title=%s OR Author=%s OR Year=%s OR ISBN=%s", (Title, Author, Year, ISBN))
        rows= cursor.fetchall()      #Fetches all rows of a query result, returns it as a list of tuples
        connect.close()
        return rows
    
print(search(Author= 'Tsu Chi'))
 

Выше приведен мой код, а ниже приведена ошибка, которую я получаю при вызове функции поиска таким образом print(search(Author= 'Tsu Chi'))
. Я хочу иметь возможность искать одно значение данных, и оно вернет строки, связанные с ним…

 Traceback (most recent call last):
  File "c:/Users/daniel/Desktop/backend.py", line 77, in <module>
    print(search(Author= 'Tsu Chi'))
  File "c:/Users/daniel/Desktop/backend.py", line 36, in search
    cursor.execute("SELECT * from books WHERE Title=%s OR Author=%s OR Year=%s OR ISBN=%s", (Title, Author, Year, ISBN))
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: ""
LINE 1: ... books WHERE Title='' OR Author='Tsu Chi' OR Year='' OR ISBN...
 

Комментарии:

1. Привет! Не могли бы вы немного отформатировать свой код?

Ответ №1:

Похоже, что по крайней мере одно из полей (название, автор, год или isbn) имеет тип данных int . Значения по умолчанию, которые вы определили для параметров функции, заставили psycopg2 передавать строковые значения во все переменные привязки.

Кстати, обычно лучше оставить одно соединение открытым и повторно использовать его для всех вызовов функций.

Комментарии:

1. итак, вы предлагаете мне перезагрузить мою таблицу, а затем преобразовать год и ISBN в ТЕКСТ вместо строкового типа данных?

2. @danyyen нет, я не говорил, что вам нужно что-либо перезагружать. Я хочу сказать, что типы переменных привязки должны соответствовать типам данных полей. Итак, «год» и «isbn» являются целыми числами, используйте целые числа в вашей программе на Python. Когда вы присваиваете им пустое строковое значение по умолчанию, вы заставляете их становиться строками.

3. Большое вам спасибо за этот совет, который вы мне дали. Я объявил год, ISBN как целочисленную переменную … —-> поиск по умолчанию (Title =»,Author =»,Year = None, ISBN = None) Это работало отлично, без ошибок. еще раз спасибо

Ответ №2:

 psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type integer: ""
LINE 1: ... books WHERE Title='' OR Author='Tsu Chi' OR Year='' OR ISBN..
 

Эта ошибка связана с тем, что ‘Year’ и ‘ISBN’ имеют тип integer, но вы передаете им пустые строки.

Если вы хотите выполнять поиск на основе одного или нескольких условий, попробуйте использовать аргументы ключевых слов переменной длины, как в приведенном ниже коде:

Я новичок в программировании, поэтому я не знаю, является ли это самым элегантным или эффективным кодом, но он должен служить цели.

Вы можете выполнить поиск с одним или несколькими условиями в предложении ‘where’ и также передать требуемое условие joiner (или / и).

 def search(condition_joiner='',**kwargs):
    connect= psycopg2.connect("dbname= 'bookshop' user='postgres' password='0973' host='localhost' port='5432'")
    cursor= connect.cursor()
    
    search_string='SELECT * from books WHERE '
    condition_count=0
    for key,value in kwargs.items():
        condition_count =1
        if condition_count>1:
            search_string  = condition_joiner
        search_key= ' {}={}'.format(key,value)
        search_string = search_string search_key
    
    cursor.execute(search_string)
    rows= cursor.fetchall()      #Fetches all rows of a query result, returns it as a list of tuples
    connect.close()
    return rows
    

print(search(Author= ''Tsu Chi''))
 

Используйте переменную search_string для передачи инструкции в cursor.execute()

search_key здесь мы ставим все необходимые условия (1 или много) и присоединяем их к search_string одному за другим.

Если у вас более 1 условия condition_joiner , используется для объединения различных условий, таких как Author='some_author' OR Title='some_title'

Вы можете передать столько, сколько требуется search() . Обязательно используйте escape-символ для использования кавычек при передаче строк.

Обновите, если это работает. Спасибо.

Комментарии:

1. Да, это работает, но теперь это вмешивается в функцию вставки… Я думаю, что я преобразоваю столбец Year / ISBN в ТЕКСТОВЫЙ тип данных и снова попробую функцию поиска.. Спасибо

2. Как это влияет на функцию вставки?