SQLAlchemy是一个强大的Python SQL工具箱, 提供了包括ORM在内的各种支持.

首先使用pip安装;

pip install SQLAlchemy

SQL Expression Language 是SQLAlchemy Core的组成部分, 提供了与SQL类似的API而避免了直接书写SQL语句.

连接数据库

使用下列语句连接数据库:

  1. from sqlalchemy import create_engine
  2. engine = create_engine("mysql://root:passwd@localhost:3306/webpy?charset=utf8", echo=True)

create_engine的第一个参数的格式为:

  1. 数据库类型://用户名:密码@数据库主机地址/数据库名?编码

没有密码则为空,不填; echo=True则在终端进行回显, 默认为False.

engine可以直接执行sql语句:

  1. engine.execute("SELECT * FROM user")

如果需要事务性操作则需要使用connect:

  1. conn = engine.connect()
  2. result = conn.execute("SELECT * FROM user")

Create Table

使用metadata和Table类来定义表:

  1. from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
  2. import MySQLdb
  3. engine = create_engine("mysql://root:password@localhost:3306/test?charset=utf8", encoding="utf-8", echo=True)
  4. metadata = MetaData()
  5. # define
  6. user = Table('user', metadata,
  7. Column('user_id', Integer, primary_key=True),
  8. Column('name', String(20)),
  9. )
  10. # do create and commit
  11. metadata.create_all(engine)

回显信息:

  1. ...
  2. INFO sqlalchemy.engine.base.Engine
  3. CREATE TABLE user (
  4. user_id INTEGER NOT NULL AUTO_INCREMENT,
  5. name VARCHAR(20),
  6. PRIMARY KEY (user_id)
  7. )
  8. ....
  9. INFO sqlalchemy.engine.base.Engine COMMIT

Insert

使用engine.connect()来执行:

  1. from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
  2. import MySQLdb
  3. engine = create_engine("mysql://root:password@localhost:3306/test?charset=utf8", encoding="utf-8", echo=True)
  4. metadata = MetaData()
  5. user = Table('user', metadata,
  6. Column('user_id', Integer, primary_key=True),
  7. Column('name', String(20)),
  8. Column('fullname', String(40)),
  9. )
  10. conn = engine.connect()
  11. i = user.insert()
  12. u = {'name': 'yichya'}
  13. result = conn.execute(i, **u)

select

仍然使用conn对象, 先做一个select * from user

  1. conn = engine.connect()
  2. s = user.select()
  3. result = conn.execute(s)
  4. print (result.fetchall() )

回显:

  1. INFO sqlalchemy.engine.base.Engine SELECT user.user_id, user.name, user.fullname FROM user
  2. INFO sqlalchemy.engine.base.Engine ()
  3. [(1L, u'yichya', None)]

可以使用for-each遍历结果集:

  1. >>>for raw in result:
  2. ... print(raw)
  3. INFO sqlalchemy.engine.base.Engine ()
  4. (1L, u'yichya', None)
  5. (2L, u'finley', None)
  6. (3L, u'yy', None)
  7. (4L, u'godess', None)

使用user的column对象可以自定义查询的字段

  1. >>>print(user.c)
  2. ['user.user_id', 'user.name', 'user.fullname']

注意select不是从user对象中获得的:

  1. from sqlalchemy.sql import select
  2. conn = engine.connect()
  3. s = select([user.c.user_id, user.c.name])
  4. result = conn.execute(s)
  5. print (result.fetchall() )

可以在终端看到:

  1. INFO sqlalchemy.engine.base.Engine SELECT user.user_id, user.name
  2. FROM user
  3. INFO sqlalchemy.engine.base.Engine ()
  4. [(1L, u'yichya'), (2L, u'finley'), (3L, u'yy'), (4L, u'godess')]

使用where()筛选记录:

  1. from sqlalchemy.sql import select
  2. conn = engine.connect()
  3. s = select([user.c.name]).where(user.c.name == 'yy')
  4. result = conn.execute(s)
  5. print(result.fetchall() )

可以看到回显:

  1. INFO sqlalchemy.engine.base.Engine SELECT user.name
  2. FROM user
  3. WHERE user.name = %s
  4. INFO sqlalchemy.engine.base.Engine ('yy',)
  5. [(u'yy',)]

实际上user.c重载了各种运算符:

  1. >>>print(user.c.name == None)
  2. "user".name IS NULL

where支持的运算符包括: > < <= >= ==!= , 逻辑符and,or, not需要用下述方法:

  1. >>>from sqlalchemy.sql import and_
  2. >>>print(and_(user.c.user_id == address.c.user_id, address.c.city == 'New York') )
  3. "user".user_id = address.user_id AND address.city = :city_1

顺便展示了多表连接查询, 也可以使用join进行查询:

  1. >>>s = select([user.c.name, address.c.email]).select_from(user.join(address, user.c.user_id==address.c.user_id))
  2. >>>print s
  3. SELECT "user".name, address.email
  4. FROM "user" JOIN address ON "user".user_id = address.user_id

更多的查询请参见,文末的参考链接.

Update

仍然使用connect执行:

  1. conn = engine.connect()
  2. u = user.update().where(user.name == 'yichya').values(name='aa')
  3. result = conn.execute(u)

Delete

delete也很简单:

  1. >>>d = user.delete().where(user.c.name == 'yichya')
  2. >>>conn.execute(d)
  3. INFO sqlalchemy.engine.base.Engine DELETE FROM user WHERE user.name = %s
  4. INFO sqlalchemy.engine.base.Engine ('yichya',)
  5. INFO sqlalchemy.engine.base.Engine COMMIT

参考资料:

sqlalchemy docs latest

SQLAlchemy 简单笔记

使用SQLAlchemy-廖雪峰

SQLAlchemy之SQL Expression的更多相关文章

  1. SQL Expression Language Tutorial 学习笔记二

    11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...

  2. SQL Expression Language Tutorial 学习笔记一

    http://docs.sqlalchemy.org/en/latest/core/tutorial.html Google 翻译了一下 SQLAlchemy Expression Language, ...

  3. sqlalchemy防sql注入

    银行对安全性要求高,其中包括基本的mysql防注入,因此,记录下相关使用方法: 注意:sqlalchemy自带sql防注入,但是在 execute执行 手写sql时 需要考虑此安全问题 对于 wher ...

  4. sqlalchemy 执行sql

    关键需要使用text from sqlalchemy import create_engine, text sql = 'SELECT * FROM my_table WHERE account_id ...

  5. sqlalchemy执行sql语句

    #删除user表中的所有数据,表中的自增字段又从默认值开始 session.execute("truncate table user")

  6. SqlAlchemy个人学习笔记完整汇总-转载

    使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM.   前两种方式可以统称为 core ...

  7. python面试题解析(前端、框架和其他)

    答: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  8. Python3 连接各类数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口.它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多 ...

  9. SQL学习笔记八之ORM框架SQLAlchemy

    阅读目录 一 介绍 二 创建表 三 增删改查 四 其他查询相关 五 正查.反查 一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进 ...

随机推荐

  1. RDLC报表学习

    RDLC报表由以下三部分构成: 1.制作自己的DateSet集合(就是报表的数据集): 2.制作自己的报表文件.rdlc文件,用于画做报表样式,里面有微软自带的导出和打印功能,其实就为了少做这2个功能 ...

  2. 关于ubuntu下看视频中文字幕乱码的问题

    试了几个播放器都不行.....然后把字幕文件打开后重新保存成utf-8的.... 可以了!!!! 天呐改编码真是一个万能的办法~ 随手记

  3. 企业项目开发--分布式缓存memcached(3)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3.3.ssmm0-data 结构: 3.3.1.pom.xml  1 <?xml version=& ...

  4. Servlet实现session读写

    前言     一个女人让他的程序员丈夫去商店买东西:你去附近的商店买些面包,如果有鸡蛋的话,买6个回来,这个丈夫买了6个面包回来,他的妻子大吃一惊:你为什么买了6个面包?! 程序员丈夫回答:因为他们有 ...

  5. jzoj3027

    根據打表找規律可得ans=c(k−n,n)∗an∗bk−nans=c(k-n,n)*a^n*b^{k-n}ans=c(k−n,n)∗an∗bk−n #include<bits/stdc++.h& ...

  6. 极验(Geetest) Laravel 5 集成开发包,让验证更安全

    简述 在网站开发中使用频率最高的工具之一便是验证码,验证码在此也是多种多样,不过简单的图片验证码已经可以被机器识别,极验验证码提供了一个安全可靠的滑动验证码体系,让网站开发更加安全. 先感受一下这种验 ...

  7. 合服导致 globalserver 起不来的问题

    globalserver 报错 RMIInitArmyBackObject InitError 根据报错信息一路追查下来,发现某个帮派的数据解析 json 的时候报错.监视变量,找出这段字符串,大致结 ...

  8. 删除 Win10 更新后的 Z 盘符(已验证)

    如果你有一些不希望被访客看见的文件.照片或者视频,希望将它隐藏在一个只有自己知道的地方,那么今天的这篇教程非常适合你.我们要实现的最终效果是这样的:在Win10的"此电脑"中,有这 ...

  9. class字节码结构(三)(字段集合的结构)

    <Java虚拟机原理图解>1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的 字段区:包括了字段计数器和字段数据区: 字段是指在类中定义的静态或者非静态的 ...

  10. 一个MySQL 5.7 分区表性能下降的案例分析

    告知MySQL5.7.18的使用者分区表使用中存在的陷阱,避免在该版本上继续踩坑.同时通过对源码的讲解,升级MySQL5.7.18时分区表性能下降的根本原因,向MySQL源码爱好者展示分区表实现中锁的 ...