1. ORM框架和SQLAlchemy简介
ORM(Object-Relational Mapping)框架是将对象映射到关系型数据库中,以方便对关系型数据库的操作。通过ORM框架,我们可以使用面向对象的语法来编写SQL语句。 SQLAlchmey是Python中最流行的ORM框架之一。 SQLAlchmey提供了一组完整的工具来建立和管理关系型数据库,并且对于关系数据库的高级应用具备良好的扩展性,同时也可以扩展到非关系数据库模式。
2. 安装SQLAlchemy
2.1 安装命令
在命令行中输入下面的命令可以安装SQLAlchemy:
pip install sqlalchemy
2.2 安装结果
安装完成后,可以在Python环境中导入SQLAlchemy库。
import sqlalchemy
3. SQLAlchemy的基本用法
3.1 创建数据库和数据表
SQLAlchemy可与不同类型的关系型数据库进行交互,我们需要为指定的数据库创建一个类型引擎。在创建这种类型引擎之前,我们需要安装驱动程序。在示例中,我们将使用SQLite数据库,因此我们将使用SQLite驱动程序来创建下面的SQLAlchemy引擎:
from sqlalchemy import create_engine
engine = create_engine('sqlite:///foo.db')
该引擎使用SQLite数据库创建,并将数据库保存到当前目录下名为foo.db的文件中。可以通过以下方式来创建表模式:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
address = Column(String)
engine = create_engine('sqlite:///foo.db')
Base.metadata.create_all(engine)
在该示例中,我们定义了一个名为User的表,其中包含属性id、name、age和address。所有表都是从Base继承而来的。首先,需要将对元数据定义的模式进行编译,然后使用engine对象进行实际创建。在该示例中,我们使用SQLite作为数据库引擎。
3.2 处理数据
使用SQLAlchemy的主要目的是能够使用面向对象的语法获取数据而不是在数据库中手动查询。我们可以使用SQLAlchemy的ORM来执行与数据的交互。在本节中,我们将运用ORM在数据表中执行CRUD操作。
3.2.1 添加数据
以下示例演示如何创建一个新对象,并将其保存在表中。
from sqlalchemy import create_engine, Column, Integer, String
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)
age = Column(Integer)
address = Column(String)
engine = create_engine('sqlite:///foo.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
user = User(name='Michael', age=23, address='Shanghai')
session.add(user)
session.commit()
3.2.2 查询数据
以下示例展示了如何查询表中的所有对象。
from sqlalchemy import create_engine, Column, Integer, String
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)
age = Column(Integer)
address = Column(String)
engine = create_engine('sqlite:///foo.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
users = session.query(User).all()
for u in users:
print (u.id, u.name, u.age, u.address)
3.2.3 更新数据
以下示例演示如何更新表中的对象。
from sqlalchemy import create_engine, Column, Integer, String
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)
age = Column(Integer)
address = Column(String)
engine = create_engine('sqlite:///foo.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
user = session.query(User).filter_by(name='Michael').first()
user.age = 25
session.commit()
3.2.4 删除数据
以下示例演示如何从表中删除对象。
from sqlalchemy import create_engine, Column, Integer, String
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)
age = Column(Integer)
address = Column(String)
engine = create_engine('sqlite:///foo.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
user = session.query(User).filter_by(name='Michael').first()
session.delete(user)
session.commit()
4. 总结
SQLAlchemy是一个非常好用的ORM框架,它使我们能够使用Python面向对象的语法来操作数据库,而不必关注SQL语句的细节。它提供了许多功能和工具,以便开发人员可以在不同的数据库之间轻松地移植代码。此外,它还支持复杂的数据库操作,如联接查询、嵌套查询和事务。