Cómo definir un entero sin signo en SQLAlchemy

Estoy migrando un portal a Flask con Flask-SQLAlchemy (MySQL). A continuación se muestra el código que utilicé para crear mi base de datos para mi portal existente:

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) ) """ 

Aquí es cómo trato de usarlo en 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)) 

Mi pregunta es, ¿cómo puedo hacer que el modelo SQLAlchemy se especifique como un entero sin signo?

Los tipos de SQLAlchemy (como Integer ) parecen intentar cumplir con los tipos de datos estándar de SQL. Dado que un “entero sin signo” no es un tipo de datos estándar, no verá algo como un UnsignedInteger o UnsignedInteger Integer(unsigned=True) .

En casos como estos (donde una base de datos como MySQL tiene un tipo de datos que en sí no es un tipo de datos estándar o tiene opciones que no son estándar), puede acceder a estos tipos / opciones obteniendo tipos específicos de dialecto. Para MySQL, puede acceder a estos tipos a través del módulo sqlalchemy.dialects.mysql , así …

 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)) 

Puede ser muy tarde, pero si desea que sus clases modelo puedan administrar múltiples motores de base de datos como MySQL y SqlLite (por ejemplo, durante las pruebas unitarias). Lo que puedes hacer es:

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

Y en tus modelos declarativos:

 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)