Как определить целое число без знака в SQLAlchemy

Я переношу портал в Flask с Flask-SQLAlchemy (MySQL). Ниже приведен код, который я использовал для создания моей БД для моего существующего портала:

 Users = """CREATE TABLE Users(
           id INT UNSIGNED AUTO_INCREMENT NOT NULL,
           UserName VARCHAR(40) NOT NULL,
           FirstName VARCHAR(40) NOT NULL,
           LastName VARCHAR(40) NOT NULL,
           EmailAddress VARCHAR(255) NOT NULL,      
           Password VARCHAR(40) NOT NULL,    
           PRIMARY KEY (id)
           ) """

Вот как я пытаюсь использовать его в SQLAlchemy:

 class Users(db.Model):
      id           = db.Column(db.Integer, primary_key=True)
      UserName     = db.Column(db.String(40))
      FirstName    = db.Column(db.String(40))
      LastName     = db.Column(db.String(40))
      EmailAddress = db.Column(db.String(255))
      Password     = db.Column(db.String(40))

Мой вопрос: как я могу заставить SQLAlchemy модель указываться как целое без знака?

Ответ 1

Типы SQLAlchemy (такие как Integer), кажется, пытаются соблюдать стандартные типы данных SQL. Так как "целое число без знака" не является стандартным типом данных, вы не увидите ничего похожего на UnsignedInteger или Integer(unsigned=True).

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

from sqlalchemy.dialects.mysql import INTEGER

class Users(db.Model):
    id           = db.Column(INTEGER(unsigned=True), primary_key=True)
    UserName     = db.Column(db.String(40))
    FirstName    = db.Column(db.String(40))
    LastName     = db.Column(db.String(40))
    EmailAddress = db.Column(db.String(255))
    Password     = db.Column(db.String(40))

Ответ 2

Может быть очень поздно, но если вы хотите, чтобы ваши классы моделей могли управлять несколькими механизмами баз данных, такими как MySQL и SqlLite (например, во время модульного тестирования). Что вы можете сделать, это:

UnsignedInt = Integer()
UnsignedInt = UnsignedInt.with_variant(INTEGER(unsigned=True), 'mysql')

А в ваших декларативных моделях:

class Meta(Base):
   __tablename__ = 'meta'
   meta_id = Column(UnsignedInt, primary_key=True)
   meta_key = Column(String(64), nullable=False, )
   meta_value = Column(String(128))
   species_id = Column(UnsignedInt)