1、导入sqlalchemy并查看版本 import sqlalchemy printf(sqlalchemy.version)

2、数据库连接(这里使用mysql database) from sqlalchemy import create_engine create_engine("mysql+pymysql://root:1qaz#EDC@127.0.0.1/db_ttr", encoding="utf-8", echo=True)

说明: mysql+pymysql mysql 表示使用的mysql数据库 pymysql 表示DBAPI,默认的DBAPI是mysqldb,可通过pip安装pymysql或mysqldb

echo标志是设置SQLAlchemy日志记录的一个快捷方式,它通过Python的标准日志模块实现。
启用它之后,我们将看到生成的所有SQL语句,如果不想输出有任何输出,设置为False即可
create_engine()的返回值是引擎的一个实例,它表示数据库的核心接口

关于连接其他数据库(如oracle、sqlite等)的方法以及create_engine更多的参数请参考官方链接:
http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine

3、声明一个映射 在使用ORM时,配置过程:1、首先描述我们要处理的数据库表,2、然后定义我们自己的类 这些类将映射到这些表。在SQLAlchemy中,这两个任务通常是一起执行的,使用一个名为Declarative,它允许我们创建包含指示的类,用来描述它们将被映射到的实际数据库表。 使用Declarative映射的类被定义为一个基类,它维护一个类和表相对于该基础的目录——这就是所谓的声明基类。 在通常导入的模块中,应用程序通常只有一个实例。我们使用declarative_base()函数创建基类,如下所示:

from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() #基类

现在我们有了一个“Base”,我们可以用它来定义任意数量的映射类。我们将从一个名为users的表开始,它将使用我们的应用程序存 储最终用户的记录。一个名为User的新类将是我们映射该表的类。在这个类中,我们定义了将要映射的表的详细信息, 主要是表名,以及列的名称和数据类型:

from sqlalchemy import Column, Integer, String class User(Base): #User类是映射该表的类 tablename = 'users' #表名users

id = Column(Integer, primary_key=True) #列(或称字段) Integer是数据类型中的整型,primary_key=True设置为主键
name = Column(String(60)) #String数据类型中的字符串,60是长度
fullname = Column(String(60))
password = Column(String(60))

def __repr__(self):
    return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password)
	
# User类定义了__repr__()方法,但请注意,这是可选的; 以便我们的示例显示漂亮的用户对象。

4、创建一个模式 通过使用声明系统构造的用户类,我们已经定义了关于表的信息,即表元数据。 SQLAlchemy用来表示特定表的信息的对象称为table对象,这里声明性已经为我们做了一个。 通过检查__table__属性,我们可以看到这个对象: In [10]: User.table Out[10]: 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('password', String(), table=<users>), schema=None)

当我们声明我们的类时,声明使用Python元类,以便在类声明完成后执行其他活动;在这个阶段中,它根据我们的规范创建了一个表对象, 并通过构造一个Mapper对象将其与类关联起来。这个对象是我们通常不需要直接处理的幕后对象(尽管它可以提供大量关于我们需要它的映射的信息)。 表对象是一个称为元数据的更大集合的成员。当使用声明性的时候,这个对象可以使用。我们声明基类的元数据属性。元数据是一个注册表, 它包括向数据库发出有限的模式生成命令集的能力。由于我们的SQLite数据库实际上没有一个用户表,所以我们可以使用元数据为所有不存在的表向数据库发出CREATE table语句。 下面,我们调用MetaData.create_all()方法,将引擎作为数据库连接的源传递。我们将看到,首先发出特殊命令来检查users表的存在, 然后执行实际的CREATE table语句:

Base.metadata.create_all(engine) #执行实际的CREATE table语句,只有执行了这个语句才会真正的在数据库里创建表和插入数据

5、创建映射类的一个实例 通过完成映射,现在让我们创建并检查一个用户对象: ed_user = User(name='tianran', fullname='tantianran', password='1qaz#EDC')

6、创建一个会话 现在我们可以开始与数据库对话了。ORM对数据库的“句柄”是会话。当我们第一次设置应用程序时, 在与create_engine()语句相同的级别上,我们定义了一个会话类,它将作为新会话对象的工厂:

from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine)

这个定制的会话类将创建绑定到我们数据库的新会话对象。在调用sessionmaker时也可以定义其他事务特性; 这些将在后面的章节中描述。然后,每当需要与数据库进行对话时,就实例化一个会话: session = Session()

7、添加和更新对象 Session = sessionmaker(bind=engine) session = Session() session.add(ed_user)

在这一点上,我们说实例正在等待;还没有发出SQL,而且该对象还没有被数据库中的一行表示。会话将会发出SQL,在需要的时候,使用被称为“刷新”的进程,将琼斯尽快持久化。 如果我们为Ed Jones查询数据库,所有待处理的信息将首先被刷新,然后在此后立即发出查询。 例如,在下面我们创建一个新的查询对象,它加载用户实例。我们“过滤”了ed的name属性, 并指出我们只希望第一个结果出现在完整的行列表中。返回一个用户实例, 它相当于我们添加的内容: our_user = session.query(User).filter_by(name='ed').first() print(our_user)

我们可以使用add_all()添加更多的用户对象: session.add_all([ User(name='wendy', fullname='Wendy Williams', password='foobar'), User(name='mary', fullname='Mary Contrary', password='xxg527'), User(name='fred', fullname='Fred Flinstone', password='blah')] )

如需要单独更新一条记录: ed_user.password = 'f8s7ccs'

查看哪些记录是被修改过的: session.dirty

查看等待提交的对象 session.new

提交会话(只有执行了这一步才会真在的将数据写入到数据库) session.commit()

8、回滚操作 session.rollback()

如做了一些修改,在没有执行session.commit()之前,都可以进行回滚操作

9、查询 for instance in session.query(User).order_by(User.id): print(instance.id,instance.name, instance.fullname, instance.password)

关于更多的查询方法,参见官方文档:http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query

10、创建的过滤操作符

更多关于过滤操作请参见官方文档:http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.filter

11、返回列表和标量 待补充。。。。 12、使用文本sql 待补充。。。 13、计数 待补充。。。 14、建立一个关系 待补充。。。