简介
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上,这是一种有效的数据类型,但在其他类型上是不允许的。因此,如果在其中一个数据库上运行