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、建立一个关系
待补充。。。
本文转自 TtrToby 51CTO博客,原文链接:http://blog.51cto.com/freshair/2048610