SQLAlchemy 是一個強大的 Python ORM(對象關系映射)工具,它允許開發者通過 Python 對象來操作數據庫。SQLAlchemy 提供了豐富的數據類型,用于在 Python 和數據庫之間進行數據映射。本文將詳細介紹 SQLAlchemy 中常用的數據類型及其使用方法。
SQLAlchemy 的數據類型主要分為兩大類:
Integer
、String
、Float
等。VARCHAR
、INTEGER
、FLOAT
等。SQLAlchemy 的數據類型通常用于定義模型中的列(Column),以便在數據庫中創建相應的表結構。
Integer
類型用于表示整數。它可以映射到數據庫中的 INTEGER
類型。
from sqlalchemy import Column, Integer
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
age = Column(Integer)
Float
類型用于表示浮點數。它可以映射到數據庫中的 FLOAT
類型。
from sqlalchemy import Column, Float
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
price = Column(Float)
Numeric
類型用于表示高精度的十進制數。它可以映射到數據庫中的 NUMERIC
或 DECIMAL
類型。
from sqlalchemy import Column, Numeric
class Account(Base):
__tablename__ = 'accounts'
id = Column(Integer, primary_key=True)
balance = Column(Numeric(10, 2)) # 10位數字,其中2位小數
String
類型用于表示字符串。它可以映射到數據庫中的 VARCHAR
或 TEXT
類型。
from sqlalchemy import Column, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50)) # 最大長度為50的字符串
Text
類型用于表示長文本。它可以映射到數據庫中的 TEXT
類型。
from sqlalchemy import Column, Text
class Article(Base):
__tablename__ = 'articles'
id = Column(Integer, primary_key=True)
content = Column(Text)
DateTime
類型用于表示日期和時間。它可以映射到數據庫中的 DATETIME
或 TIMESTAMP
類型。
from sqlalchemy import Column, DateTime
from datetime import datetime
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True)
start_time = Column(DateTime, default=datetime.utcnow)
Date
類型用于表示日期。它可以映射到數據庫中的 DATE
類型。
from sqlalchemy import Column, Date
from datetime import date
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
birthdate = Column(Date)
Time
類型用于表示時間。它可以映射到數據庫中的 TIME
類型。
from sqlalchemy import Column, Time
from datetime import time
class Schedule(Base):
__tablename__ = 'schedules'
id = Column(Integer, primary_key=True)
start_time = Column(Time)
Boolean
類型用于表示布爾值(True
或 False
)。它可以映射到數據庫中的 BOOLEAN
或 TINYINT
類型。
from sqlalchemy import Column, Boolean
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
is_active = Column(Boolean, default=True)
LargeBinary
類型用于表示二進制數據。它可以映射到數據庫中的 BLOB
或 BYTEA
類型。
from sqlalchemy import Column, LargeBinary
class File(Base):
__tablename__ = 'files'
id = Column(Integer, primary_key=True)
data = Column(LargeBinary)
Enum
類型用于表示枚舉值。它可以映射到數據庫中的 ENUM
類型。
from sqlalchemy import Column, Enum
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
role = Column(Enum('admin', 'user', 'guest'))
JSON
類型用于表示 JSON 數據。它可以映射到數據庫中的 JSON
類型。
from sqlalchemy import Column, JSON
class Config(Base):
__tablename__ = 'configs'
id = Column(Integer, primary_key=True)
settings = Column(JSON)
ARRAY
類型用于表示數組。它可以映射到數據庫中的 ARRAY
類型(例如 PostgreSQL 中的 ARRAY
)。
from sqlalchemy import Column, ARRAY, Integer
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
scores = Column(ARRAY(Integer))
UUID
類型用于表示 UUID(通用唯一標識符)。它可以映射到數據庫中的 UUID
類型(例如 PostgreSQL 中的 UUID
)。
from sqlalchemy import Column, UUID
import uuid
class User(Base):
__tablename__ = 'users'
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
SQLAlchemy 允許開發者定義自己的數據類型。通過繼承 TypeDecorator
類,可以創建自定義的數據類型。
from sqlalchemy import TypeDecorator, String
class MyCustomType(TypeDecorator):
impl = String
def process_bind_param(self, value, dialect):
# 在將數據存儲到數據庫之前進行處理
return value.upper()
def process_result_value(self, value, dialect):
# 在從數據庫讀取數據之后進行處理
return value.lower()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
custom_field = Column(MyCustomType(50))
許多數據類型都支持參數,用于指定數據的長度、精度、默認值等。
例如,String
類型可以指定最大長度:
name = Column(String(50)) # 最大長度為50的字符串
例如,Numeric
類型可以指定精度和小數位數:
balance = Column(Numeric(10, 2)) # 10位數字,其中2位小數
可以為列指定默認值:
is_active = Column(Boolean, default=True)
默認情況下,列是可空的??梢酝ㄟ^ nullable
參數指定列是否允許為空:
name = Column(String(50), nullable=False)
SQLAlchemy 的數據類型會自動映射到數據庫中的相應類型。例如,Integer
類型會映射到 INTEGER
,String
類型會映射到 VARCHAR
或 TEXT
。
不同的數據庫可能對同一數據類型有不同的實現。SQLAlchemy 會根據所使用的數據庫自動選擇合適的映射。
例如,Boolean
類型在 PostgreSQL 中映射到 BOOLEAN
,而在 MySQL 中映射到 TINYINT
。
如果需要自定義數據類型在特定數據庫中的映射,可以使用 TypeEngine.with_variant
方法。
from sqlalchemy import Integer, TypeEngine
class MyCustomType(TypeEngine):
impl = Integer
def load_dialect_impl(self, dialect):
if dialect.name == 'postgresql':
return dialect.type_descriptor(Integer)
elif dialect.name == 'mysql':
return dialect.type_descriptor(Integer)
else:
return dialect.type_descriptor(Integer)
custom_type = MyCustomType().with_variant(Integer, 'postgresql')
SQLAlchemy 提供了多種方式來驗證數據的有效性。
可以在列上添加約束,例如 unique
、primary_key
、foreign_key
等。
email = Column(String(100), unique=True)
可以使用 validates
裝飾器來定義自定義的校驗邏輯。
from sqlalchemy.orm import validates
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(100))
@validates('email')
def validate_email(self, key, address):
assert '@' in address, 'Invalid email address'
return address
可以使用 SQLAlchemy 的事件系統來監聽數據的變化,并在數據變化時執行自定義的校驗邏輯。
from sqlalchemy import event
@event.listens_for(User.email, 'set')
def validate_email(target, value, oldvalue, initiator):
if '@' not in value:
raise ValueError('Invalid email address')
SQLAlchemy 提供了多種方式來轉換數據類型。
可以使用 TypeDecorator
來定義自定義的數據類型轉換邏輯。
from sqlalchemy import TypeDecorator, String
class MyCustomType(TypeDecorator):
impl = String
def process_bind_param(self, value, dialect):
return value.upper()
def process_result_value(self, value, dialect):
return value.lower()
可以使用 cast
函數來強制轉換數據類型。
from sqlalchemy import cast, Integer
query = session.query(cast(User.age, Integer))
選擇合適的數據類型對數據庫性能有重要影響。
為經常查詢的列創建索引可以顯著提高查詢性能。
name = Column(String(50), index=True)
選擇合適的數據類型大小可以減少存儲空間并提高查詢性能。例如,使用 SmallInteger
而不是 Integer
可以減少存儲空間。
age = Column(SmallInteger)
對于 Numeric
類型,選擇合適的精度和小數位數可以減少存儲空間并提高計算性能。
balance = Column(Numeric(10, 2))
在數據庫遷移過程中,可能需要修改數據類型。SQLAlchemy 提供了 alembic
工具來管理數據庫遷移。
可以使用 alter_column
來修改列的數據類型。
from alembic import op
def upgrade():
op.alter_column('users', 'age', type_=SmallInteger)
def downgrade():
op.alter_column('users', 'age', type_=Integer)
在修改數據類型時,可能需要遷移現有數據??梢允褂?batch_alter_table
來批量修改表結構。
from alembic import op
def upgrade():
with op.batch_alter_table('users') as batch_op:
batch_op.alter_column('age', type_=SmallInteger)
def downgrade():
with op.batch_alter_table('users') as batch_op:
batch_op.alter_column('age', type_=Integer)
SQLAlchemy 提供了豐富的數據類型,用于在 Python 和數據庫之間進行數據映射。通過合理選擇和使用這些數據類型,可以有效地管理數據庫中的數據,并提高應用程序的性能和可維護性。
在實際開發中,應根據具體的業務需求選擇合適的數據類型,并注意數據類型的性能影響和遷移問題。通過掌握 SQLAlchemy 的數據類型,開發者可以更加靈活地操作數據庫,構建高效、可靠的應用程序。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。