На столбец в таблице нельзя ссылаться при выполнении запроса SQL: столбец не существует - PullRequest
0 голосов
/ 05 мая 2020

При попытке вставить тестовые данные в мою БД с помощью приведенного ниже кода я получаю эту ошибку. Я знаю, что моя база данных настроена правильно и работает с моим приложением Flask, но я не могу заполнить базу данных значениями из моего MOCK_DATA.csv файла

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedColumn) column "content" does not exist
LINE 3:         (content, rating, book_id, (SELECT user_id FROM user...
                 ^
HINT:  There is a column named "content" in table "reviews", but it cannot be referenced from this part of the query.

[SQL: --sql
        INSERT INTO reviews VALUES
        (content, rating, book_id, (SELECT user_id FROM users WHERE username=%(username)s))
        --endsql]
[parameters: {'username': 'Brent'}]

Схема: таблица обзоров

CREATE TABLE IF NOT EXISTS reviews (
    review_id SERIAL PRIMARY KEY,
    content TEXT,
    rating INTEGER,
    user_id INTEGER REFERENCES users,
    book_id INTEGER REFERENCES books

Схема: таблица пользователей

CREATE TABLE IF NOT EXISTS users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(255),
    password VARCHAR(255)

seed.py

FILE = open("MOCK_DATA.csv")
reader = csv.reader(FILE)

firstline = True
for username, password, content, rating in reader:
    # skip first line of csv file
    if firstline:
        firstline = False
        continue

    # fill users table
    DB.execute(
        """--sql
    INSERT INTO users (username, password) VALUES 
    (:username, :password) ON CONFLICT DO NOTHING
    --endsql""", {
            "username": username,
            "password": generate_password_hash(password)
        })

    print("added user")

    # add review for user
    DB.execute(
        """--sql
    INSERT INTO reviews VALUES
    (content, rating, book_id, 
    (SELECT user_id FROM users WHERE username=:username))
    --endsql""", {
            "content": content,
            "rating": rating,
            "book_id": 288,
            "username": username,
        })

    print("added review")
    DB.commit()

MOCK_DATA .csv

username,password,content,rating
Brent,OoDQgc,"Sed vel enim sit amet nunc viverra dapibus. Nulla suscipit ligula in lacus. Curabitur at ipsum ac tellus semper interdum. Mauris ullamcorper purus sit amet nulla. Quisque arcu libero, rutrum ac, lobortis vel, dapibus at, diam.",1

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Я попытался выполнить один запрос в DBeaver и выяснил, что я неправильно интерполирую значения, поэтому ЗНАЧЕНИЯ должны быть (: content,: rating,: book_id, et c)

Также имена пользователей не 'не уникально, поэтому мне пришлось добавить LIMIT 1 к выражению SELECT для username

FILE = open("MOCK_DATA.csv")
reader = csv.reader(FILE)

firstline = True
for username, password, content, rating in reader:
    # skip first line of csv file
    if firstline:
        firstline = False
        continue

    # fill users table
    DB.execute(
        """--sql
    INSERT INTO users (username, password) VALUES 
    (:username, :password) ON CONFLICT DO NOTHING
    --endsql""", {
            "username": username,
            "password": generate_password_hash(password)
        })

    print("added user")

    # add review for user
    DB.execute(
        """--sql
    INSERT INTO reviews (content, rating, book_id, user_id) VALUES
    (:content, :rating, :book_id, 
    (SELECT user_id FROM users WHERE username=:username LIMIT 1))
    --endsql""",
        {
            "content": content,
            "rating": rating,
            # add book_id for book you want to add the reviews for
            "book_id": 288,
            "username": username
        })

    print("added review")
    DB.commit()
0 голосов
/ 05 мая 2020

Вы не можете ссылаться в предложении VALUES на имена столбцов целевой таблицы.

Попробуйте вместо SQL что-то вроде:

INSERT INTO reviews (content, rating, book_id) VALUES
    (v_content, v_rating, v_book_id,
    (SELECT user_id FROM users WHERE username=:username))

, где переменные v_xxx определены в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...