专栏:012:没时间解释了,快使用sqlalchemy

用理工科思维看待这个世界

系列爬虫专栏

崇尚的学习思维是:输入,输出平衡,且平衡点不断攀升。

今天的主题是:sqlalchemy的使用(这是一篇没有真正实战的博文)

0:框架

序号

内容

说明

01

概念解释

是什么?

02

代码解释

怎么做?

03

总结

如何做的?


1:概念

  • ORM 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。

图片显示:对象和数据库之间的映射

1462796986482.png

原理:

1462797367071.png

  • SQLAlchemy 是python的一款开源软件,提供了SQL工具包及对象关系映射(ORM)工具。(需要安装第三方库) 官方文档
  • 为什么会出现这种技术? 一句话解释:为了避免写繁复的sql语句.(隐藏数据库,良好的数据接口,动态的数据映射,引入缓存)

2:代码解释

一般步骤:

  • 创建连接
  • 声明映射文件
  • 创建模式
  • 初始化映射类实例
  • 创建回话
  • 持久化实例对象

1:创建连接

from sqlalchemy import create_engine
engine = create_engine("mysql://root:123456@localhost:3306/test?charset=utf8", echo = True)

# echo= True 会打印操作数据库的信息

Database_urls 的组成形式: dialect+driver://username:password@host:port/database 举例:

  1. mysql://root:123456@localhost:3306/test
  2. postgresql://scott:tiger@localhost/mydatabase
  3. oracle://scott:tiger@127.0.0.1:1521/sidname
  4. sqlite:///foo.db 具体参见:点我点我

2:声明映射文件

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(10))
    password = Column(String(10))

    def __repr__(self):
        return "<User(name='%s', name='%s', password='%s')>" % (self.name, self.name, self.password)

# 以上声明了表文件的形式:表名为:users, 包含3列:id, name, password,且定义了数据类型

3:创建数据库表

User.metadata.create_all(engine)
# 运行后会在本地mysql数据库中创建这个数据库表

---
结果显示:
2016-05-09 20:52:38,062 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2016-05-09 20:52:38,091 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,094 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2016-05-09 20:52:38,094 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,114 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin'
2016-05-09 20:52:38,114 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,116 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2016-05-09 20:52:38,117 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,127 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2016-05-09 20:52:38,128 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,158 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin AS anon_1
2016-05-09 20:52:38,158 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,160 INFO sqlalchemy.engine.base.Engine DESCRIBE `users`
2016-05-09 20:52:38,160 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,168 INFO sqlalchemy.engine.base.Engine ROLLBACK
2016-05-09 20:52:38,170 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE users (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    name VARCHAR(10), 
    password VARCHAR(10), 
    PRIMARY KEY (id)
)


2016-05-09 20:52:38,171 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,655 INFO sqlalchemy.engine.base.Engine COMMIT

数据库test中生成表数据:

1462798497039.png

4:创建会话

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

5:持久化实例对象

ed_user = User(id=1, name='xiexiaolu', password='dianwo')
session.add(ed_user)
session.commit()

数据显示:插入一条数据

1462798847878.png

# 查询操作
user=session.query(User).filter(User.id ==1).one()
print(user.name)
print(user.password)
# output: id =1 的数据的 name 和 password
xiexiaolu
dianwo

创建数据表的其他方式

from sqlalchemy import Table, MetaData, create_engine

engine = create_engine("mysql+mysqlconnector://root:123456@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)
# 创建两个数据表分别为users 和 address

插入数据的其他方式

# 在建立的会话基础上执行sql语句
session.execute('insert into users values(2,"Bob","budian")')
session.commit()

# 使用映射类成员变量的数据
user = User(id="3", name="alice", password="hgf")
session.add(user)
session.commit()

查询操作

users = session.query(User).all()# 返回数据表所有数据

修改数据

# 在会话的基础上执行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})

3:总结

参考文献: 参考文献 参考文献 参考文献

一切为了精进.


新搭建的博客:Xie-xiaolu 预览界面:

1462802927993.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

《T-SQL查询》读书笔记Part 3.索引的基本知识

索引优化是查询优化中最重要的一部分,索引是一种用于排序和搜索的结构,在查找数据时索引可以减少对I/O的需要;当计划中的某些元素需要或是可以利用经过排序的数据时,...

13330
来自专栏Android知识点总结

SpringBoot-07-之数据库JPA(CRUD)

13920
来自专栏乐沙弥的世界

Oracle 外部表

外部表只能在Oracle 9i 之后来使用。简单地说,外部表,是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据,我们

10520
来自专栏Android Note

Android—Room数据库(介绍)

16550
来自专栏Java帮帮-微信公众号-技术文章全总结

Jdbc知识点全整理,你值得拥有 ​(2)

1 DAO模式 DAO(Data Access Object)模式就是写一个类,把访问数据库的代码封装起来。DAO在数据库与业务逻辑(Service)之间。 l...

34340
来自专栏Java帮帮-微信公众号-技术文章全总结

JDBC基础入门(3)

事务 事务是由一步/几步数据库操作序列组成的逻辑执行单元, 这些操作要么全部执行, 要么全部不执行. 注: MySQL事务功能需要有InnoDB存储引擎的支持,...

36470
来自专栏JavaEdge

Spring Schedule定时关单目录1. Spring Schedule介绍2. Spring Schedule Cron表达式快速入门3. Spring Schedule Cron生成器4.

41750
来自专栏个人分享

Kudu存储实战笔记

  就像官网所说,Kudu是一个针对Apache hadoop 平台而开发的列式存储管理器,在本菜鸟看来,它是一种介于hdfs与hbase的一种存储。它的优势在...

69430
来自专栏SpringBoot 核心技术

第五章:使用QueryDSL与SpringDataJPA实现查询返回自定义对象

72240
来自专栏Java3y

移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】

移动商城【用户登陆、回显用户】 我们来实现用户登陆的功能: ? 当点击的时候,出来的是一个弹出框,我们想要切换成一个页面。 ? 找到对应的事件、切换成我们的页面...

57670

扫码关注云+社区

领取腾讯云代金券