sqlalchemysqlalchemy入门


备注

SQLALCHEMY的哲学

来自SQLAlchemy网站

SQL数据库的行为不像对象集合,更大的尺寸和性能开始变得重要;对象集合的行为不像表和行,抽象开始越重要。 SQLAlchemy旨在适应这两个原则。

SQLAlchemy认为数据库是关系代数引擎,而不仅仅是表的集合。行不仅可以从表中选择,还可以从连接和其他选择语句中选择;任何这些单元都可以组成一个更大的结构。 SQLAlchemy的表达式语言建立在这个概念的核心之上。

SQLAlchemy以其对象关系映射器(ORM)而闻名,ORM是一个提供数据映射器模式的可选组件,其中类可以以开放式,多种方式映射到数据库 - 允许对象模型和数据库模式在从一开始就干净地脱钩。

SQLAlchemy解决这些问题的整体方法与大多数其他SQL / ORM工具完全不同,这些工具植根于所谓的以互助性为导向的方法;而不是隐藏自动化墙背后的SQL和对象关系细节,所有过程都在一系列可组合的透明工具中完全暴露。该库负责自动执行冗余任务,而开发人员仍然可以控制数据库的组织方式以及SQL的构建方式。

SQLAlchemy的主要目标是改变您对数据库和SQL的思考方式!

版本

发布状态更改日志发布日期
1.1 Beta版 1.1 2016年7月26日
1.0 当前版本 1.0 2015年4月16日
0.9 保养 0.9 2013-12-30
0.8 安全 0.8 2013年3月9日

你好,世界! (SQLAlchemy Core)

此示例显示如何使用SQLAlchemy Core创建表,插入数据以及从数据库中进行选择。有关信息,请参阅SQLAlchemy ORM,请参见此处

首先,我们需要连接到我们的数据库。

from sqlalchemy import create_engine

engine = create_engine('sqlite://')
 

引擎是任何SQLAlchemy应用程序的起点。它是实际数据库及其DBAPI的“基础”,通过连接池和方言传递给SQLAlchemy应用程序,该方言描述了如何与特定类型的数据库/ DBAPI组合进行通信。引擎引用方言和连接池,它们一起解释DBAPI的模块功能以及数据库的行为。

创建引擎后,我们需要定义和创建表

from sqlalchemy import Column, Integer, Text, MetaData, Table

metadata = MetaData()
messages = Table(
    'messages', metadata,
    Column('id', Integer, primary_key=True),
    Column('message', Text),
)

messages.create(bind=engine)
 

要进一步解释MetaData对象,请参阅以下文档:

Table对象及其关联子对象的集合称为数据库元数据

我们使用Table构造在名为MetaData的目录中定义所有表,该构造类似于常规SQL CREATE TABLE语句。

现在我们已经定义和创建了表,我们可以开始插入数据了!插入涉及两个步骤。编写插入构造,并执行最终查询。

insert_message = messages.insert().values(message='Hello, World!')
engine.execute(insert_message)
 

现在我们有了数据,我们可以使用select函数来查询数据。列对象可用作Table对象上c属性的命名属性,从而可以直接选择列。执行此select语句将返回一个ResultProxy 对象,该对象可以访问几个方法, fetchone()fetchall()fetchmany() ,所有这些方法都返回在select语句中查询的多个数据库行。

from sqlalchemy import select
stmt = select([messages.c.message]) 
message, = engine.execute(stmt).fetchone()
print(message)
 

Hello, World!
 

就是这样!有关更多示例和信息,请参阅SQLAlchemy SQL表达式教程

你好,世界! (SQLAlchemy ORM)

此示例显示如何使用SQLAlchemy ORM创建表,插入数据以及从数据库中进行选择。有关信息: SQLAlchemy Core,请参阅此处

首先,我们需要连接到我们的数据库,这与我们使用SQLAlchemy Core(Core)连接的方式相同。

from sqlalchemy import create_engine

engine = create_engine('sqlite://')
 

在连接和创建引擎之后,我们需要定义和创建表。这是SQLAlchemy ORM语言开始与Core大不相同的地方。在ORM中,表创建和定义过程首先定义表和我们将用于映射到这些表的类。此过程在ORM中的一个步骤中完成,SQLAlchemy将其称为Declarative系统。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
 

既然声明了我们的基本映射器,我们可以从它继承它来构建我们的声明性映射models

from sqlalchemy import Column, Integer, String

class Message(Base):
    __tablename__ = 'messages'
    
    id = Column(Integer, primary_key=True)
    message = Column(String)
 

使用声明性基类,我们最终创建了一个TableMapper 对象。来自文档:

Table对象是一个名为MetaData的较大集合的成员。使用Declarative时,可以使用声明性基类的.metadata属性来使用此对象。

考虑到这一点,要创建所有尚不存在的表,我们可以调用下面的命令,该命令使用SQLAlchemy Core的MetaData注册表。

Base.metadata.create_all(engine)
 

现在我们的表被映射和创建,我们可以插入数据!插入是通过创建映射器实例完成的

message = Message(message="Hello World!")
message.message # 'Hello World!
 

此时,我们所拥有的只是ORM抽象级别级别的消息实例,但尚未将任何内容保存到数据库中。要做到这一点,首先我们需要创建一个会话

from sqlalchemy.orm import sessionmaker

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

此会话对象是我们的数据库处理程序根据SQLAlchemy文档:

它从引擎维护的连接池中检索连接,并保持连接,直到我们提交所有更改和/或关闭会话对象。

现在我们有了会话,我们可以新消息添加到会话并将更改提交到数据库。

session.add(message)
session.commit()
 

现在我们有了数据,我们可以利用ORM查询语言来提取数据。

query = session.query(Message)
instance = query.first()
print (instance.message) # Hello World!
 

但那只是一个开始!还有更多可用于组合查询的功能,如filterorder_by 等等。有关更多示例和信息,请参阅SQLAlchemy ORM教程

安装或设置

pip install sqlalchemy
 

对于大多数常见应用程序,尤其是Web应用程序,通常建议初学者考虑使用补充库,例如flask-sqlalchemy

pip install flask-sqlalchemy