контактам не удалось собрать ни одного столбца первичного ключа для сопоставленной таблицы

#flask #sqlalchemy #flask-sqlalchemy

#фляжка #sqlalchemy #flask-sqlalchemy

Вопрос:

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

 C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagesflask_sqlalchemy__init__.py:833: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  warnings.warn(FSADeprecationWarning(
Traceback (most recent call last):
  File "main.py", line 11, in <module>
    class Contacts(db.Model):
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagesflask_sqlalchemymodel.py", line 67, in __init__
    super(NameMetaMixin, cls).__init__(name, bases, d)
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagesflask_sqlalchemymodel.py", line 121, in __init__
    super(BindMetaMixin, cls).__init__(name, bases, d)
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyextdeclarativeapi.py", line 76, in __init__
    _as_declarative(cls, classname, cls.__dict__)
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyextdeclarativebase.py", line 131, in _as_declarative
    _MapperConfig.setup_mapping(cls, classname, dict_)
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyextdeclarativebase.py", line 160, in setup_mapping
    cfg_cls(cls_, classname, dict_)
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyextdeclarativebase.py", line 194, in __init__
    self._early_mapping()
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyextdeclarativebase.py", line 199, in _early_mapping
    self.map()
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyextdeclarativebase.py", line 695, in map
    self.cls.__mapper__ = mp_ = mapper_cls(
  File "<string>", line 2, in mapper
  File "<string>", line 2, in __init__
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyutildeprecations.py", line 139, in warned
    return fn(*args, **kwargs)
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyormmapper.py", line 723, in __init__
    self._configure_pks()
  File "C:UsersabdulAppDataLocalProgramsPythonPython38libsite-packagessqlalchemyormmapper.py", line 1409, in _configure_pks
    raise sa_exc.ArgumentError(
sqlalchemy.exc.ArgumentError: Mapper mapped class Contacts->contacts could not assemble any primary key columns for mapped table 'contacts'


My model:

app= Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/coadingthuder'
db=SQLAlchemy(app)


class Contacts(db.Model):
    """s.no name email phone_num mes date"""
    name = db.Column(db.String(80),  nullable =False)
    email = db.Column(db.String(20),  nullable =False)
    phone_num = db.Column(db.String(12),  nullable =False)
    mes = db.Column(db.String(12),  nullable =False)
    date = db.Column(db.String(12), nullable =True)
 

Ответ №1:

Согласно документам:

«Большинство ORM требуют, чтобы объекты имели определенный первичный ключ, поскольку объект в памяти должен соответствовать однозначно идентифицируемой строке в таблице базы данных»

Модели SQLAchemy (и Flask-SQLAlchemy) должны объявлять первичный ключ. Это можно сделать, добавив primary_key=True аргумент ключевого слова в столбец, который вы хотите использовать в качестве первичного ключа.

Пример Flask-SQLAlchemy:

 class Contacts(db.Model):
    """s.no name email phone_num mes date"""

    id = db.Column(db.Integer, primary_key=True)

    name = db.Column(db.String(80),  nullable =False)
    email = db.Column(db.String(20),  nullable =False)
    phone_num = db.Column(db.String(12),  nullable =False)
    mes = db.Column(db.String(12),  nullable =False)
    date = db.Column(db.String(12), nullable =True)
 

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