用OpenCV和Python進行人臉識別實戰(zhàn)
SQLAlchemy是Python中最流行的ORM(對象關系映射)框架之一,它提供了高效且靈活的數(shù)據(jù)庫操作方式。本文將介紹如何使用SQLAlchemy ORM進行數(shù)據(jù)庫操作。
安裝
pip install sqlalchemy
如果需要連接特定數(shù)據(jù)庫,還需安裝相應的驅(qū)動程序:
# PostgreSQL pip install psycopg2-binary # MySQL pip install mysql-connector-python # SQLite (Python標準庫已包含,無需額外安裝)
核心概念
- Engine:數(shù)據(jù)庫連接的引擎,負責與數(shù)據(jù)庫通信
- Session:數(shù)據(jù)庫會話,管理所有持久化操作
- Model:數(shù)據(jù)模型類,對應數(shù)據(jù)庫中的表
- Query:查詢對象,用于構(gòu)建和執(zhí)行數(shù)據(jù)庫查詢
連接數(shù)據(jù)庫
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 創(chuàng)建數(shù)據(jù)庫連接引擎
# SQLite示例
engine = create_engine('sqlite:///example.db', echo=True)
# PostgreSQL示例
# engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
# MySQL示例
# engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase')
# 創(chuàng)建會話工廠
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 創(chuàng)建會話實例
session = SessionLocal()定義數(shù)據(jù)模型
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base
# 創(chuàng)建基類
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
name = Column(String(50), nullable=False)
email = Column(String(100), unique=True, index=True)
# 定義一對多關系
posts = relationship("Post", back_populates="author")
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True, index=True)
title = Column(String(100), nullable=False)
content = Column(String(500))
author_id = Column(Integer, ForeignKey('users.id'))
# 定義多對一關系
author = relationship("User", back_populates="posts")
# 定義多對多關系(通過關聯(lián)表)
tags = relationship("Tag", secondary="post_tags", back_populates="posts")
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True, index=True)
name = Column(String(30), unique=True, nullable=False)
posts = relationship("Post", secondary="post_tags", back_populates="tags")
# 關聯(lián)表(用于多對多關系)
class PostTag(Base):
__tablename__ = 'post_tags'
post_id = Column(Integer, ForeignKey('posts.id'), primary_key=True)
tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=True)創(chuàng)建數(shù)據(jù)庫表
# 創(chuàng)建所有表 Base.metadata.create_all(bind=engine) # 刪除所有表 # Base.metadata.drop_all(bind=engine)
基本CRUD操作
創(chuàng)建數(shù)據(jù)
# 創(chuàng)建新用戶
new_user = User(name="張三", email="zhangsan@example.com")
session.add(new_user)
session.commit()
# 批量創(chuàng)建
session.add_all([
User(name="李四", email="lisi@example.com"),
User(name="王五", email="wangwu@example.com")
])
session.commit()讀取數(shù)據(jù)
# 獲取所有用戶 users = session.query(User).all() # 獲取第一個用戶 first_user = session.query(User).first() # 根據(jù)ID獲取用戶 user = session.query(User).get(1)
更新數(shù)據(jù)
# 查詢并更新
user = session.query(User).get(1)
user.name = "張三四"
session.commit()
# 批量更新
session.query(User).filter(User.name.like("張%")).update({"name": "張氏"}, synchronize_session=False)
session.commit()刪除數(shù)據(jù)
# 查詢并刪除 user = session.query(User).get(1) session.delete(user) session.commit() # 批量刪除 session.query(User).filter(User.name == "李四").delete(synchronize_session=False) session.commit()
查詢數(shù)據(jù)
基本查詢
# 獲取所有記錄 users = session.query(User).all() # 獲取特定字段 names = session.query(User.name).all() # 排序 users = session.query(User).order_by(User.name.desc()).all() # 限制結(jié)果數(shù)量 users = session.query(User).limit(10).all() # 偏移量 users = session.query(User).offset(5).limit(10).all()
過濾查詢
from sqlalchemy import or_
# 等值過濾
user = session.query(User).filter(User.name == "張三").first()
# 模糊查詢
users = session.query(User).filter(User.name.like("張%")).all()
# IN查詢
users = session.query(User).filter(User.name.in_(["張三", "李四"])).all()
# 多條件查詢
users = session.query(User).filter(
User.name == "張三",
User.email.like("%@example.com")
).all()
# 或條件
users = session.query(User).filter(
or_(User.name == "張三", User.name == "李四")
).all()
# 不等于
users = session.query(User).filter(User.name != "張三").all()聚合查詢
from sqlalchemy import func
# 計數(shù)
count = session.query(User).count()
# 分組計數(shù)
user_post_count = session.query(
User.name,
func.count(Post.id)
).join(Post).group_by(User.name).all()
# 求和、平均值等
avg_id = session.query(func.avg(User.id)).scalar()連接查詢
# 內(nèi)連接
results = session.query(User, Post).join(Post).filter(Post.title.like("%Python%")).all()
# 左外連接
results = session.query(User, Post).outerjoin(Post).all()
# 指定連接條件
results = session.query(User, Post).join(Post, User.id == Post.author_id).all()關系操作
# 創(chuàng)建帶關系的對象
user = User(name="趙六", email="zhaoliu@example.com")
post = Post(title="我的第一篇博客", content="Hello World!", author=user)
session.add(post)
session.commit()
# 通過關系訪問
print(f"文章 '{post.title}' 的作者是 {post.author.name}")
print(f"用戶 {user.name} 的所有文章:")
for p in user.posts:
print(f" - {p.title}")
# 多對多關系操作
python_tag = Tag(name="Python")
sqlalchemy_tag = Tag(name="SQLAlchemy")
post.tags.append(python_tag)
post.tags.append(sqlalchemy_tag)
session.commit()
print(f"文章 '{post.title}' 的標簽:")
for tag in post.tags:
print(f" - {tag.name}")事務管理
# 自動提交事務
try:
user = User(name="測試用戶", email="test@example.com")
session.add(user)
session.commit()
except Exception as e:
session.rollback()
print(f"發(fā)生錯誤: {e}")
# 使用事務上下文管理器
from sqlalchemy.orm import Session
def create_user(session: Session, name: str, email: str):
try:
user = User(name=name, email=email)
session.add(user)
session.commit()
return user
except:
session.rollback()
raise
# 嵌套事務
with session.begin_nested():
user = User(name="事務用戶", email="transaction@example.com")
session.add(user)
# 保存點
savepoint = session.begin_nested()
try:
user = User(name="保存點用戶", email="savepoint@example.com")
session.add(user)
savepoint.commit()
except:
savepoint.rollback()最佳實踐
- 會話管理:為每個請求創(chuàng)建新會話,請求結(jié)束后關閉
- 異常處理:始終處理異常并適當回滾事務
- 延遲加載:注意N+1查詢問題,使用 eager loading 優(yōu)化
- 連接池:合理配置連接池大小和超時設置
- 數(shù)據(jù)驗證:在模型層或應用層驗證數(shù)據(jù)完整性
# 使用上下文管理器管理會話
from contextlib import contextmanager
@contextmanager
def get_db():
db = SessionLocal()
try:
yield db
db.commit()
except Exception:
db.rollback()
raise
finally:
db.close()
# 使用示例
with get_db() as db:
user = User(name="上下文用戶", email="context@example.com")
db.add(user)總結(jié)
SQLAlchemy ORM提供了強大而靈活的數(shù)據(jù)庫操作方式,通過本文的介紹,您應該能夠:
- 安裝和配置SQLAlchemy
- 定義數(shù)據(jù)模型和關系
- 執(zhí)行基本的CRUD操作
- 構(gòu)建復雜查詢
- 管理數(shù)據(jù)庫事務
- 遵循最佳實踐
SQLAlchemy還有更多高級特性,如混合屬性、事件監(jiān)聽、自定義查詢等,值得進一步探索學習。
到此這篇關于用OpenCV和Python進行人臉識別實戰(zhàn)的文章就介紹到這了,更多相關OpenCV Python人臉識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- opencv 做人臉識別 opencv 人臉匹配分析
- OPENCV+JAVA實現(xiàn)人臉識別
- python+opencv實現(xiàn)的簡單人臉識別代碼示例
- java+opencv實現(xiàn)人臉識別功能
- OpenCV Java實現(xiàn)人臉識別和裁剪功能
- 詳解如何用OpenCV + Python 實現(xiàn)人臉識別
- Python基于opencv實現(xiàn)的人臉識別(適合初學者)
- Python opencv實現(xiàn)人眼/人臉識別以及實時打碼處理
- 結(jié)合OpenCV與TensorFlow進行人臉識別的實現(xiàn)
- 基于python3 OpenCV3實現(xiàn)靜態(tài)圖片人臉識別
- OpenCV實現(xiàn)人臉識別
相關文章
Python讀取DataFrame的某行或某列的方法實現(xiàn)
Dataframe是Python中一種重要的數(shù)據(jù)處理工具,它能夠以表格形式存儲并處理數(shù)據(jù),本文主要介紹了Python讀取DataFrame的某行或某列的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-04-04
Python中淺拷貝的四種實現(xiàn)方法小結(jié)
本文主要介紹了Python中淺拷貝的四種實現(xiàn)方法小結(jié),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Scrapy項目實戰(zhàn)之爬取某社區(qū)用戶詳情
這篇文章主要介紹了Scrapy項目實戰(zhàn)之爬取某社區(qū)用戶詳情,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

