使用场景

SQLAlchemy 是一个强大的 Python SQL 工具包和对象关系映射(ORM)系统,适用于以下场景: - 需要与关系型数据库交互的 Python 应用程序 - 需要数据库抽象层以避免直接编写 SQL 的项目 - 需要在不同数据库后端之间切换的应用程序 - 需要复杂查询构建的应用程序 - 需要同时使用 ORM 和原始 SQL 的项目

优势

  1. 数据库抽象:支持多种数据库后端(PostgreSQL, MySQL, SQLite, Oracle, MS-SQL等)
  2. ORM 功能:将数据库表映射为 Python 类,行映射为对象
  3. 灵活性:既可以使用高级 ORM,也可以直接使用低层 SQL
  4. 连接池:内置高效的数据库连接池
  5. 事务管理:提供强大的事务控制能力
  6. 查询构建:提供 Pythonic 的方式来构建复杂查询
  7. 成熟稳定:经过多年发展,社区支持强大

核心功能

  1. Engine:数据库引擎和连接池
  2. Connection Pooling:连接池管理
  3. Dialect:处理不同数据库的差异
  4. SQL Expression Language:SQL 表达式语言
  5. ORM:对象关系映射系统

入门示例

示例1:基本连接和原始 SQL 操作

```python from sqlalchemy import create_engine, text

创建引擎 (这里使用 SQLite 内存数据库)

engine = create_engine('sqlite:///:memory:', echo=True)

执行原始 SQL

with engine.connect() as conn: # 创建表 conn.execute(text(""" CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER ) """))

# 插入数据
conn.execute(text("""
    INSERT INTO users (name, age) VALUES 
    ('Alice', 30),
    ('Bob', 25),
    ('Charlie', 35)
"""))

# 查询数据
result = conn.execute(text("SELECT * FROM users WHERE age > :age"), {"age": 28})
for row in result:
    print(f"ID: {row.id}, Name: {row.name}, Age: {row.age}")

```

示例2:使用 ORM 定义模型

```python from sqlalchemy import createengine, Column, Integer, String from sqlalchemy.ext.declarative import declarativebase from sqlalchemy.orm import sessionmaker

# 定义基类
Base = declarative_base()

# 定义模型
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

    def __repr__(self):
        return f"<User(name='{self.name}', age={self.age})>"

# 创建引擎和表
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 添加数据
user1 = User(name='Alice', age=30)
user2 = User(name='Bob', age=25)
session.add_all([user1, user2])
session.commit()

# 查询数据
users = session.query(User).filter(User.age > 28).all()
print(users)  # 输出: [<User(name='Alice', age=30)>]

```

示例3:更复杂的 ORM 查询

```python from sqlalchemy import createengine, Column, Integer, String, ForeignKey from sqlalchemy.ext.declarative import declarativebase from sqlalchemy.orm import sessionmaker, relationship

Base = declarative_base()

class Author(Base):
    __tablename__ = 'authors'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    books = relationship("Book", back_populates="author")

class Book(Base):
    __tablename__ = 'books'
    id = Column(Integer, primary_key=True)
    title = Column(String)
    author_id = Column(Integer, ForeignKey('authors.id'))
    author = relationship("Author", back_populates="books")

# 设置数据库
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

# 添加数据
author = Author(name="J.K. Rowling")
author.books = [
    Book(title="Harry Potter and the Philosopher's Stone"),
    Book(title="Harry Potter and the Chamber of Secrets")
]
session.add(author)
session.commit()

# 复杂查询
result = session.query(Author).join(Book).filter(Book.title.like("%Philosopher%")).first()
print(f"Author: {result.name}")
for book in result.books:
    print(f" - {book.title}")

```

示例4:使用 SQL 表达式语言

```python from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, select

metadata = MetaData()

users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('age', Integer), )

创建引擎和表

engine = createengine('sqlite:///:memory:') metadata.createall(engine)

插入数据

with engine.connect() as conn: conn.execute(users.insert(), [ {"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}, {"name": "Charlie", "age": 35} ])

# 构建查询
stmt = select([users.c.name, users.c.age]).where(users.c.age > 28)

# 执行查询
result = conn.execute(stmt)
for row in result:
    print(f"Name: {row.name}, Age: {row.age}")

```

这些示例展示了 SQLAlchemy 的不同使用方式,从原始 SQL 操作到高级 ORM 功能。SQLAlchemy 的灵活性允许你根据项目需求选择合适的使用方式。