Ошибка столбец none не существует

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 пишет:
«ERROR: ОШИБКА: столбец users.fk не существует
LINE 1: SELECT * FROM users INNER JOIN hobby ON users.fk = hobby.pk
^

SQL state: 42703
Character: 41″
Не понимаю в чём проблема. Внешний ключ существует и с ним всё в порядке.

Таблица hobby:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE IF NOT EXISTS public.hobby
(
    id INTEGER NOT NULL DEFAULT NEXTVAL('hobby_id_seq'::regclass),
    hobby_name CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT hobby_pkey PRIMARY KEY (hobby_name)
        INCLUDE(id)
)
 
TABLESPACE pg_default;
 
ALTER TABLE IF EXISTS public.hobby
    OWNER TO postgres;

Таблица users:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE IF NOT EXISTS public.users
(
    id INTEGER NOT NULL DEFAULT NEXTVAL('users_id_seq'::regclass),
    first_name CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    second_name CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    date_of_birth DATE NOT NULL,
    email CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    hobby CHARACTER VARYING COLLATE pg_catalog."default",
    CONSTRAINT users_pkey PRIMARY KEY (id),
    CONSTRAINT hobby_fkey FOREIGN KEY (hobby)
        REFERENCES public.hobby (hobby_name) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        NOT VALID
)
 
TABLESPACE pg_default;
 
ALTER TABLE IF EXISTS public.users
    OWNER TO postgres;

Запрос, который не получается произвести:

SQL
1
SELECT * FROM users INNER JOIN hobby ON users.fk = hobby.pk

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

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

Честно говоря, не знаю. Делали задание в классе, там всё получилось, а вот дома — нет, ошибка где-то. Нужно было выполнить запрос:

SQL
1
SELECT * FROM table1 INNER JOIN table2 ON table1.fk = table2.pk

В классе программа сама предложила дописать запрос в конце, поэтому как раз часть

SQL
1
table1.fk = table2.pk

так и не понял, просто не запомнил, что там написал.

0

Аватар

1419 / 887 / 339

Регистрация: 31.05.2012

Сообщений: 3,114

09.10.2022, 09:13

4

SQL
1
ON users.hobby = hobby.hobby_name

0

4720 / 3928 / 994

Регистрация: 29.08.2013

Сообщений: 25,187

Записей в блоге: 3

09.10.2022, 17:40

5

Цитата
Сообщение от yoimelv
Посмотреть сообщение

Делали задание в классе, там всё получилось

так голову нужно включать
таблицы то соединяются по колонкам, а у вас явное сообщение «столбец users.fk не существует»

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

09.10.2022, 17:40

Помогаю со студенческими работами здесь

DataGridView. Существует ли столбец?
Как мне узнать, существует ли столбец с заданным именем в DataGridView?
Проверять в цикле не…

Ошибка — Не существует в пространстве имен, но оно существует!
Всем привет! В соседней ветке пытаюсь разобраться как адекватно сделать вертикальную менюшку, но…

База данных — столбец в таблице не существует
pgAdmin 4 выдает ошибку: ERROR: ОШИБКА: столбец &quot;Дискретная математика&quot; в таблице &quot;Экзамены&quot; не…

Как проверить существует ли столбец в DGV
у меня в компоненте грид столбцы создаются динамически, так вот как создать условие которое…

Существует ли в матрице столбец, состоящий только из нулей
Заполнить массив 2 на 5 случайными числами от 0 до 1. вывести «да», если существует столбец,…

Существует ли в матрице строка или столбец палиндром
помогите пожалуйста создать программу для задачи :
существует ли в матрице строка или столбец…

Функция определяющая, существует ли столбец матрицы, упорядоченный по возрастанию
помогите написать ТОЛЬКО ФУНКЦИЮ.
А именно, описать функцию проверки, существует ли в квадратной…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

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:

Чтобы вставить нулевые значения в базу данных, у вас есть два варианта:

  1. опустите это поле в инструкции INSERT или
  2. использовать 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 сделана, код падает на его лицо. Кто-нибудь сохранит меня …

  • Ошибка стоила очень дорого
  • Ошибка студенчество отмечали начало каникул является
  • Ошибка стирания команда scsi отменена
  • Ошибка структуры данных карты тахографа атол
  • Ошибка стиральной машины электролюкс е04