Невозможно вставить новые записи с помощью Flask SQLAlchemy - PullRequest
0 голосов
/ 28 апреля 2019

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

ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'builtin_function_or_method' [SQL: 'INSERT INTO beaches (id, beach_name, lat, long, beach_description) VALUES (%(id)s, %(beach_name)s, %(lat)s, %(long)s, %(beach_description)s)'] [parameters: {'lat': 45.01, 'beach_description': 'some stuff here', 'id': <built-in function id>, 'long': 45.01, 'beach_name': 'test'}] (Background on this error at: http://sqlalche.me/e/f405)

Это код, в котором я определяю класс "пляж" в моем файле моделей.

class Beach(db.Model):

    __tablename__ = 'beaches'

    id = db.Column(db.Integer, primary_key=True)
    beach_name = db.Column(db.String(256))
    lat = db.Column(db.Numeric)
    long = db.Column(db.Numeric)
    beach_description = db.Column(db.String(256))

    def __init__(self, id, beach_name, lat, long, beach_description):
        self.id = id
        self.beach_name = beach_name
        self.lat = lat
        self.long = long
        self.beach_description = beach_description

Это код, в котором я создаю экземпляр класса и пытаюсь вставить его в базу данных.

beach_name = "test"
lat = 45.01
long = 45.01
beach_description = "some stuff here"

new_beach = Beach(id, beach_name, lat, long, beach_description)

db.session.add(new_beach)
db.session.commit()

Это схема таблицы, в которую я пытаюсь вставить. Я использую Postgres.

CREATE TABLE beaches (
    id SERIAL PRIMARY KEY,
    beach_name text,
    lat double precision,
    long double precision,
    beach_description text
);

Существует s имилар-выглядящий пост , где комментатор предлагает удалить «id» при создании экземпляра класса. Для меня это было бы похоже на код ниже. Я пробовал этот вариант, и я получаю ту же ошибку.

beach_name = "test"
lat = 45.01
long = 45.01
beach_description = "some stuff here"

new_beach = Beach(beach_name, lat, long, beach_description)

db.session.add(new_beach)
db.session.commit()

Несмотря на то, что приведенная выше рекомендация не работает, я полагаю, что проблема где-то с автоинкрементным столбцом id в моей таблице. Спасибо за любой совет!

1 Ответ

0 голосов
/ 30 апреля 2019

Если кто-то столкнется с подобной проблемой ...

Решение состоит в том, чтобы удалить id из списка аргументов и бит self.id = id из класса Beach, а также удалить id при создании нового экземпляра класса Beach.

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

Пересмотренный код для класса выглядит следующим образом.

class Beach(db.Model):

    __tablename__ = 'beaches'

    id = db.Column(db.Integer, primary_key=True)
    beach_name = db.Column(db.String(256))
    lat = db.Column(db.Numeric)
    long = db.Column(db.Numeric)
    beach_description = db.Column(db.String(256))

    def __init__(self, beach_name, lat, long, beach_description):
        self.beach_name = beach_name
        self.lat = lat
        self.long = long
        self.beach_description = beach_description

При создании нового экземпляра и добавлении его в базу данных он должен выглядеть следующим образом ...

beach_name = "test"
lat = 45.01
long = 45.01
beach_description = "some stuff here"

new_beach = Beach(beach_name, lat, long, beach_description)

db.session.add(new_beach)
db.session.commit()
...