Step-by-Step SqlAlchemy Tutorial(part 1 of 2)
2012-04-22 01:35
351 查看
一直觉得orm很高深,今天时间比较充分打算学习下
安装说一点,我的系统是win7 64位家庭普通版
用easy_install安装sqlalchemy出现问题,于是下载最新版0.7.6的zip压缩包,用python setup.py install出现错误:
没办法又下了0.6.8版的zip包,这次安装成功了。
开始我的sqlalchemy之旅
本文主要是翻译这篇文章(还有自己的操作和思考,我会竟可能做到有图有真相,呵呵):点击打开链接:如果有错请指正
创建我们第一个脚本:
我们将利用SqlAlchemy创建我们第一个例子,创建一个简单的表,存储用户的姓名,年龄和密码
首先需要导入一些包,然后我们创建一个数据库连接engine对象。在这里我们使用sqlite数据库,不需要提供认证信息。
你肯定注意到了,我们将echo设置为True,目的是SqlAlchemy将会把执行sql命令的过程输出到标准输出。这主要是便于调试,但如果是用于生产环境中应该设置为False。
然后我们创建一个MetaData对象,这个对象包含了数据库的所有元数据。它由表的描述信息和其它的数据库schema-level
的对象组成。我们可以在创建MetaData对象时就把它绑定到我们的数据库,也可以在上面代码的最后即 create_all 时绑定。在第二部分有示例(点击打开链接)
下面部分就是创建表的过程。这是由SqlAlchemy的表对象和列对象完成的。我们可以使用各种字段类型,如String,Integer等等。在这里,我们创建一个名为users的表,然后传给了metadata对象。然后我们创建了4个字段,id设置为主键,当我们向这个表中增加用户呢时,SqlAlchemy 会自动将id加一(自增)。name字段设置为String类型,40个字符长度。age字段是简单的Integer类型,password字段也被设置为String类型,而且我们没有设置长度。addresses_table与users表的主要不同就是我们设置了外键属性用来联系两张表。
最后一个片段实际上创建了数据库和表。每当你调用create_all()时,在创建表之前会检查表是否存在。也就是说,你可以创建额外的表,但当你调用create_all时SqlAlchemy
仅仅会创建新的表。
Tips:
SqlAlchemy 也提供了装载已经创建的表的方法:
插入数据:
有几种不同的方式插入数据和查询数据。我们先考虑低级的方式,然后再考虑这个系列的其它部分,我们将进入稍微抽象的Sessions和Declarative样式。
让我们一起看看插入数据的几种不同方法吧。
上面的代码展示了如何利用连接对象插入数据的方式。首先,你需要调用表的insert()方法创建一个Insert对象,然后你就可以用Insert的values()方法增加一行你所需要的数据
。然后我们创建了Connection对象,最后对Insert对象调用Connection对象的execute方法。这听起来有点复杂,其实很简单。
检验一下吧:我是用sqlite.exe打开tutorial.db
我们发现,插入成功了,而且id字段自动设为1,符合我们定义的刚才对primary_key的解释。
下面的片段展示了一些没有用Connection对象的插入数据方法:
我们检验一下成功了没有?
有没有发现id的确是自增的?
在上面的两个列子中,你都需要调用表对象的insert方法。在插入方法的最后,我们看一下如何插入多行数据。
这已经相当明白了,要点就是你需要先前创建的Connection对象,并传递两个参数。
效果如下:
现在,我们来看看查询操作。
SqlAlchemy为查询操作提供了一组方法。这里,我们将关注简单的方法。
最常见的例子就是做一个全查询,我们开始吧
首先我们导入select方法,然后我们把表作为一个元素的列表传入,最后我们调用select对象的execute方法,并把结果赋给了result变量,最后就是迭代了。
如果你需要所有的结果存储在一个由元组组成的列表而不是行对象,你可以这么做。
如果你只需要第一条记录返回,你可以用fetchone()代替fetchall():
现在假设我们需要更小粒度的结果,下面,我们仅仅想返回name和age,而不要密码。
很好,这是相当的简单。我们所需要做的只是在select语句中明确列名。那个'c'基本意思是:column.
如果你有多个表,也许select语句应该有点像这样:
当然这很可能返回重复的结果,因此你为了解决这个问题,你将这么做:
SqlAlchemy文档中,称第一种结果集为笛卡尔积。上诉第二种语句消除了那些烦恼。怎么消除的?在这种查询的方式中使用了where子句是一种解决办法。在下面部分,我将用sessions展示一种与where查询子句不同的方法。
下面是一些示列,注释中有解释
安装说一点,我的系统是win7 64位家庭普通版
用easy_install安装sqlalchemy出现问题,于是下载最新版0.7.6的zip压缩包,用python setup.py install出现错误:
WARNING: The C extension could not be compiled, speedups are not enabled. Plain-Python build succeeded.自己未解决,向广大朋友们请教了
没办法又下了0.6.8版的zip包,这次安装成功了。
开始我的sqlalchemy之旅
本文主要是翻译这篇文章(还有自己的操作和思考,我会竟可能做到有图有真相,呵呵):点击打开链接:如果有错请指正
http://www.blog.pythonlibrary.org/2010/02/03/another-step-by-step-sqlalchemy-tutorial-part-1-of-2/
创建我们第一个脚本:
我们将利用SqlAlchemy创建我们第一个例子,创建一个简单的表,存储用户的姓名,年龄和密码
from sqlalchemy import create_engine from sqlalchemy import MetaData, Column, Table, ForeignKey from sqlalchemy import Integer, String engine = create_engine('sqlite:///tutorial.db',echo=True) metadata = MetaData(bind=engine) users_table = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String(40)), Column('age', Integer), Column('password', String), ) addresses_table = Table('addresses', metadata, Column('id', Integer, primary_key=True), Column('user_id', None, ForeignKey('users.id')), Column('email_address', String, nullable=False) ) # create tables in database metadata.create_all()深入看下代码:
首先需要导入一些包,然后我们创建一个数据库连接engine对象。在这里我们使用sqlite数据库,不需要提供认证信息。
你肯定注意到了,我们将echo设置为True,目的是SqlAlchemy将会把执行sql命令的过程输出到标准输出。这主要是便于调试,但如果是用于生产环境中应该设置为False。
然后我们创建一个MetaData对象,这个对象包含了数据库的所有元数据。它由表的描述信息和其它的数据库schema-level
的对象组成。我们可以在创建MetaData对象时就把它绑定到我们的数据库,也可以在上面代码的最后即 create_all 时绑定。在第二部分有示例(点击打开链接)
下面部分就是创建表的过程。这是由SqlAlchemy的表对象和列对象完成的。我们可以使用各种字段类型,如String,Integer等等。在这里,我们创建一个名为users的表,然后传给了metadata对象。然后我们创建了4个字段,id设置为主键,当我们向这个表中增加用户呢时,SqlAlchemy 会自动将id加一(自增)。name字段设置为String类型,40个字符长度。age字段是简单的Integer类型,password字段也被设置为String类型,而且我们没有设置长度。addresses_table与users表的主要不同就是我们设置了外键属性用来联系两张表。
最后一个片段实际上创建了数据库和表。每当你调用create_all()时,在创建表之前会检查表是否存在。也就是说,你可以创建额外的表,但当你调用create_all时SqlAlchemy
仅仅会创建新的表。
Tips:
SqlAlchemy 也提供了装载已经创建的表的方法:
someTable = Table("users", metadata, autoload=True, schema="schemaName")
插入数据:
有几种不同的方式插入数据和查询数据。我们先考虑低级的方式,然后再考虑这个系列的其它部分,我们将进入稍微抽象的Sessions和Declarative样式。
让我们一起看看插入数据的几种不同方法吧。
# create an Insert object ins = users_table.insert() # add values to the Insert object new_user = ins.values(name="Joe", age=20, password="pass") # create a database connection conn = engine.connect() # add user to database by executing SQL conn.execute(new_user)
上面的代码展示了如何利用连接对象插入数据的方式。首先,你需要调用表的insert()方法创建一个Insert对象,然后你就可以用Insert的values()方法增加一行你所需要的数据
。然后我们创建了Connection对象,最后对Insert对象调用Connection对象的execute方法。这听起来有点复杂,其实很简单。
检验一下吧:我是用sqlite.exe打开tutorial.db
我们发现,插入成功了,而且id字段自动设为1,符合我们定义的刚才对primary_key的解释。
下面的片段展示了一些没有用Connection对象的插入数据方法:
# a connectionless way to Insert a user ins = users_table.insert() result = engine.execute(ins, name="Shinji", age=15, password="nihongo") # another connectionless Insert result = users_table.insert().execute(name="Martha", age=45, password="dingbat")
我们检验一下成功了没有?
有没有发现id的确是自增的?
在上面的两个列子中,你都需要调用表对象的insert方法。在插入方法的最后,我们看一下如何插入多行数据。
conn.execute(users_table.insert(), [ {"name": "Ted", "age":10, "password":"dink"}, {"name": "Asahina", "age":25, "password":"nippon"}, {"name": "Evan", "age":40, "password":"macaca"} ])
这已经相当明白了,要点就是你需要先前创建的Connection对象,并传递两个参数。
效果如下:
现在,我们来看看查询操作。
SqlAlchemy为查询操作提供了一组方法。这里,我们将关注简单的方法。
最常见的例子就是做一个全查询,我们开始吧
from sqlalchemy.sql import select s = select([users_table]) result = s.execute() for row in result: print row结果如下:
首先我们导入select方法,然后我们把表作为一个元素的列表传入,最后我们调用select对象的execute方法,并把结果赋给了result变量,最后就是迭代了。
如果你需要所有的结果存储在一个由元组组成的列表而不是行对象,你可以这么做。
# get all the results in a list of tuples conn = engine.connect() res = conn.execute(s) rows = res.fetchall()结果如下:
如果你只需要第一条记录返回,你可以用fetchone()代替fetchall():
res = conn.execute(s) row = res.fetchone()
现在假设我们需要更小粒度的结果,下面,我们仅仅想返回name和age,而不要密码。
s = select([users_table.c.name, users_table.c.age]) result = conn.execute(s) for row in result: print row结果如下:
很好,这是相当的简单。我们所需要做的只是在select语句中明确列名。那个'c'基本意思是:column.
如果你有多个表,也许select语句应该有点像这样:
select([tableOne, tableTwo])
当然这很可能返回重复的结果,因此你为了解决这个问题,你将这么做:
s = select([tableOne, tableTwo], tableOne.c.id==tableTwo.c.user_id)
SqlAlchemy文档中,称第一种结果集为笛卡尔积。上诉第二种语句消除了那些烦恼。怎么消除的?在这种查询的方式中使用了where子句是一种解决办法。在下面部分,我将用sessions展示一种与where查询子句不同的方法。
下面是一些示列,注释中有解释
from sqlalchemy.sql import and_ # The following is the equivalent to # SELECT * FROM users WHERE id > 3 s = select([users_table], users_table.c.id > 3) # You can use the "and_" module to AND multiple fields together s = select(and_(users_table.c.name=="Martha", users_table.c.age < 25))
链接:Step-by-Step SqlAlchemy Tutorial (part 2 of 2)
相关文章推荐
- Step-by-Step SqlAlchemy Tutorial (part 2 of 2)
- A step-by-step SQLAlchemy tutorial
- OpenGL step by step - tutorial_1 "a hello window"
- Step By Step of Configuring Oracle 11gR2 (11.2.0.1) RAC to RAC Dataguard:
- SSIS 连接Oracle报错 These components are supplied by Oracle Corporation and are part of the Oracle Versi
- OpenGL step by step - tutorial_2 "hello dot"
- OpenGL step by step - tutorial_5 "Uniform Variables"
- Building websites with Xoops: A step-by-step tutorial
- Step by step tutorial to setup a JBoss Seam application
- Part4:Citrix 3D 技术Step by Step配置指导手册
- sccm 2007 r2 step by step 之十四 操作系统分发part3
- A tutorial of how to use Microsoft CMAB, Part 2
- Assignment | 01-week4 -Building your Deep Neural Network: Step by Step_part_1
- 15 Which tasks are run automatically as part of the Automated Maintenance Task by default? (Choose a
- 【com】番外篇 Step by Step COM Tutorial
- Spacewalk Installation Tutorial Step by Step On CentOS/RHEL/Fedora/Scientific Linux
- Go语言开发,step by step (Part 1:从hello world到网站开发)
- 一花一世界--VMware Horizon 部署 Step by Step Part 1
- Step-by-Step:Installation and Configuration of a secure web application using MySQL,OpenSA Web Server, Tomcat and OpenSSL,on a N
- LINQ Introduction Part 1 Of 3 By Sacha Barber(Refer from codeproject)