python数据库的ORM:SQLAlchemy指南-1

简介

Sqlalchemy 是一个python的库,主要用于将和数据库的链接进行抽象,透明化。并且使用本库 可以屏蔽大部分跨站攻击

简单使用

版本检查

>>> import sqlalchemy
>>> sqlalchemy.__version__ 
1.3.0

快速的发现当前版本是1.3.0

链接

本篇文章只使用mysql数据库。为了链接,我们需要使用create_engine()

from sqlalchemy import create_engine
engine=create_engine('mysql+pymysql://username:password@ip/database',echo=True)

echo标记用于设置SQLAlchemy 日志的快捷设置,通过python的标准logging模块完成。设置为开启时,我们会看到所有生成的sql语句

create_engine()的返回值是个Engine的实例。代表了核心数据库。通过调整数据库语言的细节 和DBAPI来适配。

在这个案例中,SQLite语言 会被解释成python的内建sqlite3模块,mysql语言会被解释成 pymysql模块

第一次调用 Engine,execute()Engine.connect时,
Engine和数据库之间会建立一个真实的DBAPI链接,用来在之后发出SQL语句。
当使用ORM时,我们正常不会在Engine刚刚建立后立马使用,取而代之的,她会在ORM的幕后使用,我们将会很快看到。

申明一个映射

当使用ORM,配置进程就开始了,他通过描述我们即将处理的数据库的表项,然后定义需要映射的这些表的类。
在现代SQLAlchemy中,这两个任务通常一起执行,使用一个称作Declarative(声明式)的系统,这个系统允许我们创建 一个类用来将描述转换为数据库指令。
使用声明性系统映射的类是根据base类定义的,base类维护与其相关的类和表的目录——这称为declarative base class(声明性基类)。在通常导入的模块中,我们的应用程序通常只有这个基的一个实例。我们使用declaration ative_base()函数创建基类,如下所示:

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

像现在我们有了一个Base,可以根据这个BASE定义任意数量的映射类。
现在开始创建一个表叫做users,用来存储终端用户使用我们应用的记录。一个新的类叫做User,用来映射这个表,在这个类里,我们定义了这个表需要映射的细节,主要是表名,列名,数据类型

>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
...     __tablename__ = 'users'
...
...     id = Column(Integer, primary_key=True)
...     name = Column(String)
...     fullname = Column(String)
...     nickname = Column(String)
...
...     def __repr__(self):
...        return "<User(name='%s', fullname='%s', nickname='%s')>" % (
...                             self.name, self.fullname, self.nickname)

使用申明类,最少需要__tablename__属性和主键列。SQLAlchemy本身从不对类所引用的表做任何假设,,包括它没有针对名称、数据类型或约束的内置约定。但这并不意味着需要样板文件;相反,我们鼓励您使用helper函数和mixin类创建自己的自动约定,具体描述见Mixin and Custom Base Classes.

构造类时,声明性方法用称为描述符的特殊Python 描述符替换所有列对象;这是一个称为检测的过程。“插装”映射类将为我们提供在SQL上下文中引用表的方法,以及从数据库中持久存储和加载列的值的方法。

创建一个模块

User类通过申明系统构建时,定义的表信息被称为表的元数据。Table对象用于SQLAlchemy表示指定表的信息。可以通过__table__属性查看对象

>>> User.__table__ 
Table('users', MetaData(bind=None),
            Column('id', Integer(), table=<users>, primary_key=True, nullable=False),
            Column('name', String(), table=<users>),
            Column('fullname', String(), table=<users>),
            Column('nickname', String(), table=<users>), schema=None)

申明类的时候,申明使用了python的元metadata,以便于在类申明后执行额外的活动,在这个阶段,根据指定的规范创建一个Table对象,并且通过构造Mapper对象将Table与类关联。这个对象是一个幕后的对象,通常不需要直接的处理他。(需要时,可以通过他获得大量的关于映射的信息)

表对象是称为元数据的较大集合的成员。当使用声明性基类的.metadata属性时,可以使用该对象。

Base的MetaData对象是一个注册表,他有像数据库发送模式生成命令的能力。当数据库上不存在我们申明的User表,我们可以调用metadata.create_all()命令,将engine作为参数传入。

>>> Base.metadata.create_all(engine)
SELECT ...
PRAGMA table_info("users")
()
CREATE TABLE users (
    id INTEGER NOT NULL, name VARCHAR,
    fullname VARCHAR,
    nickname VARCHAR,
    PRIMARY KEY (id)
)
()
COMMIT

最小表描述 VS 完整表描述

熟悉CREATE TABLE语法的用户可能会注意到,生成的VARCHAR列没有长度;在SQLite和PostgreSQL上,这是一种有效的数据类型,但在其他类型上是不允许的。因此,如果在其中一个数据库上运行

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值