#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. Как это влияет на функцию вставки?