1

Python数据库操作(SQLAlchemy、SQLite等)面试题集

 1 month ago
source link: https://blog.51cto.com/u_16701217/10511711
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Python数据库操作是软件开发中不可或缺的一环,尤其在面试环节,候选人需展现出对SQLAlchemy ORM、SQLite等工具的熟练掌握。本文将深入浅出地解析Python数据库操作相关的面试题,揭示常见问题与易错点,并提供实用的代码示例,助您在面试中脱颖而出。

Python数据库操作(SQLAlchemy、SQLite等)面试题集_数据库操作

1. SQLAlchemy基础

面试题:使用SQLAlchemy定义一个映射到SQLite表的Python类,并执行CRUD操作。

易错点与避免策略:

  • 混淆ORM与原始SQL:理解并熟练使用SQLAlchemy提供的ORM方式操作数据库,避免直接拼接SQL语句,提升代码可读性和安全性。
  • 忽视会话管理:正确使用sessionmaker()创建Session工厂,并通过session.commit()提交更改、session.rollback()回滚事务、session.close()释放资源。

代码示例:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)

engine = create_engine('sqlite:///users.db')
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

# Create
new_user = User(name='John Doe', email='[email protected]')
session.add(new_user)
session.commit()

# Read
user = session.query(User).filter_by(name='John Doe').first()
print(user.email)

# Update
user.email = '[email protected]'
session.commit()

# Delete
session.delete(user)
session.commit()

2. 查询优化与性能

面试题:使用SQLAlchemy执行复杂的查询,包括JOIN、分组、聚合等,并讨论如何优化查询性能。

易错点与避免策略:

  • 过度使用懒加载:理解懒加载(lazy loading)可能导致N+1查询问题,适时使用延时加载(joined loading)、立即加载(eager loading)策略。
  • 忽视索引:在高频查询字段上创建索引,显著提升查询速度。可通过Index()在模型定义中声明索引,或直接在SQL中创建。

代码示例:

from sqlalchemy import func, join, select

# JOIN查询
query = session.query(User, Department).join(Department, User.department_id == Department.id)
for user, dept in query:
    print(f"{user.name} works in {dept.name}")

# 分组与聚合
query = session.query(User.department_id, func.count(User.id)).group_by(User.department_id)
for dept_id, count in query:
    print(f"Department ID {dept_id} has {count} users")

# 延时加载优化
query = session.query(User).options(selectinload(User.department))  # 使用延时加载避免N+1问题

# 索引创建
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String, index=True)  # 在name字段上创建索引

3. 异常处理与事务管理

面试题:编写代码处理数据库操作中的异常,并演示如何在SQLAlchemy中进行事务管理。

易错点与避免策略:

  • 忽视异常捕获:对可能抛出异常的数据库操作使用try-except结构进行捕获,确保程序健壮性。
  • 不了解事务隔离级别与回滚机制:理解事务的ACID特性,明确何时开始事务、提交事务或回滚事务,以保证数据一致性。

代码示例:

try:
    session.begin_nested()  # 开始嵌套事务
    # 执行一系列数据库操作...
    session.commit()  # 提交事务
except Exception as e:
    session.rollback()  # 遇到异常时回滚事务
    print(f"Transaction rolled back due to error: {e}")

# 或使用with语句进行事务管理
with session.begin():
    # 执行一系列数据库操作...

综上所述,掌握Python数据库操作(尤其是SQLAlchemy与SQLite)的面试题解答技巧,识别并规避易错点,辅以实战代码示例,将使您在面试中展现出深厚的数据处理与管理能力。持续深化对数据库理论知识的理解,结合实际项目经验,您将在编程求职道路上更进一步。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK