文档章节

python处理数据库工具sqlalchemy

hgfgoodcreate
 hgfgoodcreate
发布于 2015/10/08 14:31
字数 1222
阅读 401
收藏 2

有价值的参考文档: http://www.jianshu.com/p/e6bba189fcbd

官方参考网址: http://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.html

安装sqlalchemy

pip install sqlalchemy

数据库基本操作

数据库连接

使用create_engine创建数据库连接; 例子:

from sqlalchemy import create_engine

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
connect = engine.connect()

创建表

方法一:

from sqlalchemy import Table, MetaData, create_engine

engine = create_engine("mysql+mysqlconnector://root:password@localhost:3306/test")
metadata = MetaData(bind=engine)

t1 = Table('users',
metadata,
Column('id',INT, primary_key=True),
Column('name', String(20)),
Column('fullname', String(50)),
Column('password', String(20))
) 
t2 = Table('address',
metadata, 
Column('id',INT, primary_key = True), 
Column('email_address',String(50), nullable=False),
Column('user_id', INT, ForeignKey('users.id'))
) 
t1.create()
t2.create()

方法二

from sqlalchemy import Table, MetaData, create_engine

engine = create_engine("mysql+mysqlconnector://root:password@localhost:3306/test")
metadata = MetaData()

t1 = Table('users',
metadata,
Column('id',INT, primary_key=True),
Column('name', String(20)),
Column('fullname', String(50)),
Column('password', String(20))
) 
t2 = Table('address',
metadata, 
Column('id',INT, primary_key = True), 
Column('email_address',String(50), nullable=False),
Column('user_id', INT, ForeignKey('users.id'))
) 
metadata.create_all(engine)

String 对象使用时,++必须声明大小++,对应的是mysql数据库的varchar

==区别==:方法一是直接在连接的基础上定义了模式【直接将数据库和模式对应】,而方法二先定义模式,侯江模式设置到特定的数据库中。

==重定义表结构==:在表定义的语句末尾添加extend_existing=True

表和类

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INT, String, ForeignKey
from sqlalchemy.orm import backref,relationship


Base = declarative_base()
class User(Base):
    __tablename__ = "users"
    id = Column(INT, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

class Address(Base):
    __tablename__ = "addresses"
    id = Column(INT, primary_key = True)
    email_address = Column(String, nullable = False)
    user_id = Column(INT, ForeignKey('users.id'))
    user = relationship('User', backref=backref('addresses',order_by=id))

  1. Column函数
    • 第一个参数是元组的数据类型
    • primary_key指定主键,
    • nullable指定元组是否可以为空(nullable = False表示元组不许为空)
    • ForeignKey指定外键约束,例如ForeignKey('users.id'),表示addresses表外键约束users表的主键id
  2. relatioship函数[^2x]:将会告知ORM通过Address.user,Address类自身必须链接到User类。relationship()使用两个表的外键约束来判定这种链接的性质。比如说判定Address.user将会是多对一(many-to-one)关系。
  3. backref函数[^2x]:它将提供一种用于反向查询的细节,比如说在对象User上的Address对象集是通过User.addresses属性引用,那么多对一的关系(many-to-one)反向总会是一对多关系(one-to-many)。还有对于Address.user和User.addresses的关系来说总是双向的。(一般与relationship函数结合使用。)

会话

使用sessionmaker来绑定数据库连接,并建立会话。

例子:

from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
Session = sessionmaker(bind = engine)
session = Session()

==连接信息格式==:数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名,如果碰到中文乱码问题,可在后面加上?charset=utf8

==注意==:此处的session相当于java中的statement一样,具有操作数据库的句柄,可以执行sql语句session.execute("sql语句")

添加数据

方法一:使用session执行sql语句方式

session.execute('insert into users values(2,"Bob","Bob hgf", "hgf")')
session.commit()

方法二:使用映射类成员变量的数据

user = User(id="1", name="alice", fullname="alice hgf", password="hgf")
session.add(user)
session.commit()

查询操作

  1. 查询并获取所有结果
users = session.query(User).all()

==说明==:上述语句返回所有的users表中的数据并以User对象的形式储存在列表中。

for x in query:
   print x
结果:
<__main__.User object at 0x36aa990>
<__main__.User object at 0x36aaad0>
  1. 查询并排序 根据表中的某一个元组排序,使用order_by语句
q = session.query(Address).order_by(desc(Address.user_id))
result = q.all()
for x in result:
    print x.email_address

==说明==:执行查询函数后,再使用all()函数,才能将结果映射成类的列表,类中储存从数据库中获取的一行数据。

  1. 过滤查询
q = session.query(Address).filter(Address.user_id == 1)
result = q.all()
for x in result:
    print x.email_address
  1. 连接查询
q = session.query(Address).join(Address.user).group_by(Address.id)
result = q.all()
for x in result:
    print x.email_address
  1. 常见的内联函数,聚合函数
  • 求平均值:q = session.query(func.avg(Address.id))
  • Count:session.query(Address).filter(Address.user_id ==1).count()
  • distinct:session.query(Address).disdinct().count()

删除数据

方法一:使用session执行sql语句方式

方法二:使用映射类成员变量的数据

session.query(Address).filter(Address.id ==4).delete() 
session.commit()

级联删除:在relationship关联时要加上passive_deletes=True外键要加上ondelete='CASCADE',否则sqlalchemy不能级联删除。例如:

class MyClass(Base):
    __tablename__ = 'mytable'
    id = Column(Integer, primary_key=True)
    children = relationship("MyOtherClass",
                    cascade="all, delete-orphan",
                    passive_deletes=True)

class MyOtherClass(Base):
    __tablename__ = 'myothertable'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer,
                ForeignKey('mytable.id', ondelete='CASCADE')
    )

修改数据

方法一:使用session执行sql语句方式

session.execute('update addresses set user_id = 1 where id = 2')
session.commit()

方法二:使用映射类成员变量的数据

session.query(Address).filter(Address.id == 2).update({"user_id": 1})

==注意==:update函数中的参数必须是字典类型

删除表

t1.drop() #t1是sqlalchemy.Table 对象,为users表的定义

---
**{贺广福}(heguangfu)**(tm) @2015-9-18

© 著作权归作者所有

下一篇: rabbitmq学习
hgfgoodcreate
粉丝 13
博文 60
码字总数 131679
作品 0
海淀
程序员
私信 提问
Python之使用Pandas库实现MySQL数据库的读写

  本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写。首先我们需要了解点ORM方面的知识。 ORM技术   对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是...

jclian91
2018/04/06
0
0
SQLAlchemy 和其他的 ORM 框架

Python ORM 概览 作为一个美妙的语言,Python 除了 SQLAlchemy 外还有很多ORM库。在这篇文章里,我们将来看看几个流行的可选 ORM 库,以此更好地窥探到Python ORM 境况。通过写一段脚本来读写...

oschina
2014/05/03
19.7K
6
[flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流。 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文档。 一.安...

yzy121403725
2018/05/24
0
0
异步 Python 与数据库

异步编程主题很难去讲清楚。如今,这不仅仅是一个点上的事,对于异步编程我基本上是一个门外汉。但是,由于我要处理很多关系数据库和 Python 的交互,所以我必须去解决异步 IO 和数据库编程的...

magicoding
2018/10/23
76
0
SQLAlchemy 0.9.0 发布,数据持久层框架

SQLAlchemy 0.9.0 发布,此版本主要更新内容如下: 支持本地 Python 3, 完善了即刻加载系统,包括添加了一个更有表现力的 API 能处理更多复杂的连接 支持 Postgresql JSON 类型,SQL 表达式 ...

oschina
2014/01/01
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

最新【从零单排】系列流出,教你如何实现字典存储结构

昨天在星球的【从零单排】系列分享了一篇【字典存储结构的实现方式】,我觉得这篇文章写的还是蛮好的,就分享给大家了。 但由于篇幅太长了,微信没办法全部传上来,如果你觉得内容还不错,想...

上海小胖
36分钟前
0
0
JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
5
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
5
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部