web-dev-qa-db-ja.com

SQLAlchemyで符号なし整数を定義する方法

ポータルをFlask with Flask-SQLAlchemy(MySQL)に移行しています。以下は、既存のポータルのDBを作成するために使用したコードです。

 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モデルを符号なし整数として指定するにはどうすればよいですか?

20
Ethan

SQLAlchemyタイプ( 整数 など)は、標準のSQLデータタイプに従おうとしているようです。 「符号なし整数」は標準のデータ型ではないため、UnsignedIntegerInteger(unsigned=True)のようなものは表示されません。

このような場合(MySQLなどのデータベース自体が標準のデータ型ではないデータ型または標準ではないオプションがある場合)、方言固有の型を取得することでこれらの型/オプションにアクセスできます。 MySQLの場合、これらのタイプには sqlalchemy.dialects.mysql module 、そのように...

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))
40
Mark Hildreth

非常に遅いかもしれませんが、モデルクラスで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)
6
marcoooo