Use %s
not %r
. To check what is being sent to the server use cursor. mogrify
:
update = """
UPDATE "Predictions"
SET
userid = %s,
"Fixture_No" = %s,
"Home_Side_Score" = %s,
"Away_Side_Score" = %s
WHERE
"Predictions"."userid" = %s AND
"Predictions"."Fixture_No" = %s
"""
data = (userid, Fixture_No, Home_Side_Score, Away_Side_Score, userid, Fixture_No)
print cur.mogrify(update, data)
cur.execute(update, data)
Still better, use a dictionary to pass the data:
update = """
UPDATE "Predictions"
SET
userid = %(userid)s,
"Fixture_No" = %(Fixture_no)s,
"Home_Side_Score" = %(Home_Side_Score)s,
"Away_Side_Score" = %(Away_Side_Score)s
WHERE
"Predictions"."userid" = %(userid)s AND
"Predictions"."Fixture_No" = %(Fixture_No)s
"""
data = dict (
userid = userid,
Fixture_No = Fixture_No,
Home_Side_Score = Home_Side_Score,
Away_Side_Score = Away_Side_Score
)
Создаю отношение
create table ПОТРЕБИТЕЛЬ (
ИДЕНТИФИКАТОР serial not null primary key,
НАЗВАНИЕ varchar(50) not null,
"АДРЕС ЖИТЕЛЬСТВА" varchar(255) not null,
"СКИДКА, %" smallint check ("СКИДКА, %" >= 0 and "СКИДКА, %" <= 100) not null
);
Затем пытаюсь заполнить таблицу, используя значения
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (001, "АО ВАРЯ", "Сормовский", 10);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (002, "ГАЗ", "Автозаводский", 7);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (003, "МП ВЕРА", "Канавинский", 5);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (004, "МП", "Канавинский", 3);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (005, "АО СТАЛЬ", "Советский", 0);
Возникает ошибка в каждой строчке, якобы столбец не существует, при этом это даже не столбцы а аргументы
Я все время сталкиваюсь с ошибкой «psycopg2.ProgrammingError: столбец» none «не существует».
Я прочитал документацию по psycopg2 и просмотрел однако другие сообщения об этой ошибке относятся к запросу вставки , а не запросу на обновление .
Мой код выглядит следующим образом: —
def send_to_sql(identity,list1,list2,list3):
userid = 30
Fixture_No = None
Home_Side_Score = None
Away_Side_Score = None
conn = psycopg2.connect("dbname='Euro2016' user='postgres' host='localhost' password='##passwordhere##'")
cur = conn.cursor()
cur.execute("""UPDATE "Predictions" SET userid = %r, "Fixture_No" = %r, "Home_Side_Score" = %r, "Away_Side_Score" = %r WHERE "Predictions"."userid" = %r AND "Predictions"."Fixture_No" = %r """ % (userid, Fixture_No, Home_Side_Score, Away_Side_Score, userid, Fixture_No))
conn.commit()
cur.close()
conn.close()
Этот код отлично работает, если баллы и номер приспособления, которые я пытаюсь передать, являются числами, но когда вводится None, код падает на его лицо. Кто-нибудь Спасите меня…
1 ответ
Лучший ответ
Используйте %s
, а не %r
. Чтобы проверить, что отправляется на сервер, используйте cursor. mogrify
:
update = """
UPDATE "Predictions"
SET
userid = %s,
"Fixture_No" = %s,
"Home_Side_Score" = %s,
"Away_Side_Score" = %s
WHERE
"Predictions"."userid" = %s AND
"Predictions"."Fixture_No" = %s
"""
data = (userid, Fixture_No, Home_Side_Score, Away_Side_Score, userid, Fixture_No)
print cur.mogrify(update, data)
cur.execute(update, data)
Еще лучше использовать словарь для передачи данных:
update = """
UPDATE "Predictions"
SET
userid = %(userid)s,
"Fixture_No" = %(Fixture_no)s,
"Home_Side_Score" = %(Home_Side_Score)s,
"Away_Side_Score" = %(Away_Side_Score)s
WHERE
"Predictions"."userid" = %(userid)s AND
"Predictions"."Fixture_No" = %(Fixture_No)s
"""
data = dict (
userid = userid,
Fixture_No = Fixture_No,
Home_Side_Score = Home_Side_Score,
Away_Side_Score = Away_Side_Score
)
4
Clodoaldo Neto
23 Апр 2016 в 01:58
0
1
При попытке выполнить обновление или удаление строки выдается сообщение об отсутствии поля таблицы. Хотя оно есть. Что я делаю не так?
mgi@mgi-Linux:~$ sudo su postgres
[sudo] пароль для mgi:
postgres@mgi-Linux:/home/mgi$ psql
psql (11.4 (Ubuntu 11.4-1.pgdg18.04+1), сервер 10.9 (Ubuntu 10.9-1.pgdg18.04+1))
Введите «help», чтобы получить справку.
postgres=# c megriv
psql (11.4 (Ubuntu 11.4-1.pgdg18.04+1), сервер 10.9 (Ubuntu 10.9-1.pgdg18.04+1))
Вы подключены к базе данных «megriv» как пользователь «postgres».
megriv=# SELECT * FROM formanpa;
codForma | textForma
———-+——————
11 | Aaaaaaaaaaaaa
22 | Bbbbbbbb
33 | Cccccccccccccccc
(3 строки)
megriv=# UPDATE formanpa SET textForma = ‘B2b2b2b2b2′ WHERE codForma = ’22’;
ОШИБКА: столбец «codforma» не существует
СТРОКА 1: …PDATE formanpa SET textForma = ‘B2b2b2b2b2’ WHERE codForma =…
^
ПОДСКАЗКА: Возможно, предполагалась ссылка на столбец «formanpa.codForma».
megriv=# UPDATE formanpa SET textForma = ‘B2b2b2b2b2′ WHERE formanpa.codForma = ’22’;
ОШИБКА: столбец formanpa.codforma не существует
yoimelv 0 / 0 / 0 Регистрация: 16.01.2019 Сообщений: 12 |
||||||||||||
1 |
||||||||||||
08.10.2022, 21:58. Показов 1015. Ответов 4 Метки postgres sql, sql posrgre (Все метки)
Здравствуйте! Не получается объединить таблицы по внешнему ключу. PGadmin пишет: SQL state: 42703 Таблица hobby:
Таблица users:
Запрос, который не получается произвести:
__________________ 0 |
4720 / 3928 / 994 Регистрация: 29.08.2013 Сообщений: 25,187 Записей в блоге: 3 |
|
08.10.2022, 22:57 |
2 |
а ткните пальцем где именно в таблице users колонка fk да и pk я не вижу 0 |
yoimelv 0 / 0 / 0 Регистрация: 16.01.2019 Сообщений: 12 |
||||||||
08.10.2022, 23:22 [ТС] |
3 |
|||||||
Честно говоря, не знаю. Делали задание в классе, там всё получилось, а вот дома — нет, ошибка где-то. Нужно было выполнить запрос:
В классе программа сама предложила дописать запрос в конце, поэтому как раз часть
так и не понял, просто не запомнил, что там написал. 0 |
Аватар 1419 / 887 / 339 Регистрация: 31.05.2012 Сообщений: 3,114 |
||||
09.10.2022, 09:13 |
4 |
|||
0 |
4720 / 3928 / 994 Регистрация: 29.08.2013 Сообщений: 25,187 Записей в блоге: 3 |
|
09.10.2022, 17:40 |
5 |
Делали задание в классе, там всё получилось так голову нужно включать 0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.10.2022, 17:40 |
Помогаю со студенческими работами здесь DataGridView. Существует ли столбец? Ошибка — Не существует в пространстве имен, но оно существует! База данных — столбец в таблице не существует Как проверить существует ли столбец в DGV Существует ли в матрице столбец, состоящий только из нулей Существует ли в матрице строка или столбец палиндром Функция определяющая, существует ли столбец матрицы, упорядоченный по возрастанию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 5 |
Я написал простой код, который добавляет в sql таблицу одну строку.
import psycopg2
conn = psycopg2.connect(dbname='avecoder', host='localhost',
user='postgres', password='12345678')
cur = conn.cursor()
cur.execute('INSERT INTO name2 (name) VALUES ("Sasha")')
conn.commit()
conn.close()
Но python выдает следующую ошибку:
psycopg2.errors.UndefinedColumn: ОШИБКА: столбец «Sasha» не существует
Что не так я написал?
#python #postgresql #null #psycopg2 #nonetype
Вопрос:
Существует ли хорошая практика ввода NULL
значений ключей в базу данных PostgreSQL, когда переменная находится None
в Python?
Выполнение этого запроса:
mycursor.execute('INSERT INTO products (user_id, city_id, product_id, quantity, price) VALUES (%i, %i, %i, %i, %f)' %(user_id, city_id, product_id, quantity, price))
приводит к TypeError
исключению, когда user_id
есть None
.
Как можно NULL
вставить a в базу данных , если значение равно None
, используя psycopg2
драйвер?
Комментарии:
1. Какой адаптер DB-API вы используете?
2. под адаптером DB-API я полагаю, вы имеете в виду интерфейс бд psycopg2. Если нет, можете ли вы быть более конкретным?
Ответ №1:
Чтобы вставить нулевые значения в базу данных, у вас есть два варианта:
- опустите это поле в инструкции INSERT или
- использовать
None
Также: Для защиты от SQL-инъекции вам не следует использовать обычную интерполяцию строк для ваших запросов.
Вы должны передать два (2) аргумента execute()
, например:
mycursor.execute("""INSERT INTO products
(city_id, product_id, quantity, price)
VALUES (%s, %s, %s, %s)""",
(city_id, product_id, quantity, price))
Альтернатива № 2:
user_id = None
mycursor.execute("""INSERT INTO products
(user_id, city_id, product_id, quantity, price)
VALUES (%s, %s, %s, %s, %s)""",
(user_id, city_id, product_id, quantity, price))
Комментарии:
1. Спасибо. Можете ли вы указать мне где-нибудь, чтобы я мог прочитать, почему интерполяция строк в python может привести к sql-инъекции. Это очень интересно, и я об этом не подумал.
2. Пожалуйста. Это хорошо описывает, что такое атаки с использованием SQL-инъекций: en.wikipedia.org/wiki/SQL_injection Как это связано с интерполяцией строк?: Допустим, вы получаете ненадежный ввод в свою программу. Этот ввод может содержать, например,
DROP TABLE
команду.3. Я использую None для значения столбца, но получаю ошибку: Ошибка программирования: столбец «none» не существует СТРОКА 1: …01.00-ng20′, report_date=’2016-03-30′, ec_enabled=Нет, ec_s… Вот исходный запрос, который не удался: ОБНОВИТЕ kw_daily_data_mart, УСТАНОВИТЕ имя хоста=’ctrlkey.com’, users_licensed=7, licensed_users=10, sw_version=’kw2016.01.00-ng20′, дата отчета=’2016-03-30′, ec_enabled=Нет, ec_server_count=1, config_max_file_version=10, av_enabled=True, location_count=1, sso_enabled=False, ГДЕ идентификатор пользователя=127892, идентификатор установки=3585 И имя хоста=’ctrlkey.com» ВОЗВРАЩАЮ удостоверение личности
4. Я тоже не использую ни одного, и я получаю ту же ошибку, что и @Varun. Тот же пакет python psycopg2, v2.6.2. Posgresql v9.6
5. Решение также работает с запросом на обновление. Спасибо, что поделились!
Ответ №2:
В текущем psycopg вместо » Нет «используйте переменную, равную «NULL».
variable = 'NULL'
insert_query = """insert into my_table values(date'{}',{},{})"""
format_query = insert_query.format('9999-12-31', variable, variable)
curr.execute(format_query)
conn.commit()
>> insert into my_table values(date'9999-12-31',NULL,NULL)
Комментарии:
1. это работает для psycopg2 2.8.4, решение с вставкой None заканчивается значением «None» в бд, по крайней мере, для postgres
2. Если вставляемое поле является текстовым полем, используя «NULL», просто вставьте эти четыре символа. Приведенный выше ответ (использование
None
) является правильным.
Ответ №3:
Вот мое решение:
text = 'INSERT INTO products (user_id, city_id, product_id, quantity, price) VALUES (%i, %i, %i, %i, %f)' %(user_id, city_id, product_id, quantity, price))
text = text.replace("nan", "null")
mycursor.execute(text)
Ответ №4:
Более простой подход, который также практичен при большом количестве столбцов:
Пусть row
будет список вставляемых значений, которые могут содержать None
. Чтобы вставить его в PostgreSQL, мы делаем следующее
values = ','.join(["'" str(i) "'" if i else 'NULL' for i in row])
cursor.execute('insert into myTable VALUES ({});'.format(values))
conn.commit()
Комментарии:
1. Возможно, это не по теме, но я мог бы предложить не вставлять в таблицу без указания имен столбцов.
Я продолжаю сталкиваться с ошибкой «psycopg2.ProgrammingError: column« none »не существует».psycopg2.ProgrammingError: столбец «none» не существует. Заявление об обновлении
Я прочитал psycopg2 documentation и посмотрел на других постах на этой ошибке, однако, многие из них специфические для вставки запроса вместо запроса обновления.
Моего кода выглядит следующим образом: —
def send_to_sql(identity,list1,list2,list3):
userid = 30
Fixture_No = None
Home_Side_Score = None
Away_Side_Score = None
conn = psycopg2.connect("dbname='Euro2016' user='postgres' host='localhost' password='##passwordhere##'")
cur = conn.cursor()
cur.execute("""UPDATE "Predictions" SET userid = %r, "Fixture_No" = %r, "Home_Side_Score" = %r, "Away_Side_Score" = %r WHERE "Predictions"."userid" = %r AND "Predictions"."Fixture_No" = %r """ % (userid, Fixture_No, Home_Side_Score, Away_Side_Score, userid, Fixture_No))
conn.commit()
cur.close()
conn.close()
Этот код работает отлично, если оценки и арматура число, которое я пытаюсь передать это номер, но когда запись None сделана, код падает на его лицо. Кто-нибудь сохранит меня …