orm
orm(object relational mapping),就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言
orm的优点和缺点
- orm的优点:
隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。ORM使我们构造固化数据结构变得简单易行。 - orm的缺点:
无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
sqlalchemy的安装
[root@shanwu ~]# pip3 install SQLAlchemy
Collecting SQLAlchemy
Downloading https://files.pythonhosted.org/packages/c1/c8/392fcd2d01534bc871c65cb964e0b39d59feb777e51649e6eaf00f6377b5/SQLAlchemy-1.2.7.tar.gz (5.6MB)
100% |████████████████████████████████| 5.6MB 168kB/s
Installing collected packages: SQLAlchemy
Running setup.py install for SQLAlchemy ... done
Successfully installed SQLAlchemy-1.2.7
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
sqlalchemy的使用方法
- 下面是他常用的连接格式
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
- 创建mysql的表
# !/usr/bin/python3
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
# 创建实例,并连接test库
engine = create_engine("mysql+pymysql://root:[email protected]:3306/testdb")
# echo=True 显示信息
Base = declarative_base() # 生成orm基类
class User(Base):
__tablename__ = 'user' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
Base.metadata.create_all(engine) #创建表结构 (这里是父类调子类)
#查看数据库
mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | YES | | NULL | |
| password | varchar(64) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
- 在表中插入数据
# !/usr/bin/python3
import sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 创建实例,并连接test库
engine = create_engine("mysql+pymysql://root:[email protected]:3306/testdb")
# echo=True 显示信息
Base = declarative_base() # 生成orm基类
class User(Base):
__tablename__ = 'user' # 表名
id = Column(Integer, primary_key=True)
name = Column(String(32))
password = Column(String(64))
Base.metadata.create_all(engine) #创建表结构 (这里是父类调子类)
Session_class = sessionmaker(bind=engine) # 实例和engine绑定
Session = Session_class() # 生成session实例,相当于游标
user_obj = User(id=27,name="ssss",password="123456") # 生成你要创建的数据对象
Session.add(user_obj) # 把要创建的数据对象添加到这个session里, 一会统一创建
Session.commit() #现此才统一提交,创建数据
Session.close()
#查看表中的数据
mysql> select * from user;
+----+------+----------+
| id | name | password |
+----+------+----------+
| 27 | ssss | 123456 |
+----+------+----------+
1 row in set (0.00 sec)
- 查询
my_user = Session.query(User).filter_by(name="ssss").first() # 查询
print(my_user)
#输出
<__main__.User object at 0x7f1d6b873898>
- 获取满足条件的全部
print(Session.query(User.name,User.id).all() )
#输出
[('ssss', 27)]