Flask-SQLAlchemy SQL Server UniqueIdentifier - PullRequest
0 голосов
/ 08 ноября 2019

Я создаю веб-страницу, которая использует SQL Server в качестве базы данных + Flask для веб-фреймворка. Я хочу иметь возможность добавлять пользователей на мою веб-страницу и создавать класс SQLAlchemy, как показано ниже:

from datetime import datetime
from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(), unique=True)
    password = db.Column(db.String())
    created_at = db.Column(db.DateTime(), default=datetime.now())

    def __repr__(self):
        return self.username

Однако при попытке создать таблицы SQL Server выдает следующую ошибку:

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Столбец 'email' в таблице 'user' имеетнедопустимый тип для использования в качестве ключевого столбца в индексе. (1919) (SQLExecDirectW); [42000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Не удалось создать ограничение или индекс. См. предыдущие ошибки. (1750) ") [SQL: CREATE TABLE [пользователь] (идентификатор INTEGER NOT NULL IDENTITY (1,1), электронная почта VARCHAR (макс.) NULL, пароль VARCHAR (макс.) NULL, create_at DATETIME NULL, ПЕРВИЧНЫЙ КЛЮЧ (id), УНИКАЛЬНЫЙ (электронная почта))]

Если я уберу «Unique = True», все будет работать нормально. Я думаю, это как-то связано с тем, что SQL Server не понимает, что происходит в классе или наоборот.

Любые идеи, как сделать ключ уникальным в SQL Server из SQLAlchemy

1 Ответ

0 голосов
/ 08 ноября 2019

Из Документы SQLAlchemy :

SQL Server поддерживает специальную строку «MAX» в типах данных sqltypes.VARCHAR и sqltypes.NVARCHAR, чтобы указать «максимально возможную длину». В настоящее время диалект обрабатывает это как длину «None» в базовом типе ...

И ссылка API для sqlalchemy.dialects.mssql.VARCHAR показывает сигнатуру конструктора как:

class sqlalchemy.dialects.mssql.VARCHAR(length=None, collation=None, convert_unicode=False, unicode_error=None, _warn_on_bytestring=False, _expect_unicode=False)

Поскольку значение по умолчанию length равно None, а SQLAlchemy использует length=None для сигнализации о максимальной длине varchar, все ваши столбцы String определяются как таковые, что вы можете увидеть всообщение об ошибке, которое вы отправили:

.. электронная почта VARCHAR (макс.) NULL, пароль VARCHAR (макс.) NULL

Из Документы по SQL Server :

Столбцы, содержащие текст, текст, изображение, varchar (max), nvarchar (max) и varbinary (max)типы данных нельзя указывать в качестве столбцов ключа индекса ...

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

email = db.Column(db.String(256), unique=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...