#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)
Целочисленные первичные ключи будут автоматически создаваться и увеличиваться с помощью этой конфигурации, поэтому нет необходимости добавлять их самостоятельно при создании новых экземпляров модели.