ORM框架使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。如今最知名的Python ORM模块是SQLAlchemy 和SQLObject,今天简单介绍一下SQLAlchemy。
先看一下自己的系统是否安装SQLAlchemy模块:
我这边是没有安装的,因为我的系统有python2和python3两个版本,我这边默认使用的是Python2,先进入Python2用pip进行安装:
再在python console端import一下试试看安装是否成功:
我们来看一下SQLAlchemy的简单框架图:
首先,我们根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
MySQL-Python
mysql+mysqldb://:@[:]/
pymysql
mysql+pymysql://:@/[?]
MySQL-Connector
mysql+mysqlconnector://:@[:]/
cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
因为上一篇我们使用了mysqldb,这里我们直接用mysql-python来进行操作
使用 Engine/ConnectionPooling/Dialect 进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。:
这边简单演示一个连接并查询:
#!/usr/bin/ env python
#coding=utf-8
from sqlalchemy import create_engine
#创建引擎
engine = create_engine("mysql+mysqldb://root@localhost:3306/python", max_overflow=5)
#执行查询sql语句
result = engine.execute('select * from test')
res = result.fetchall()
print(res)
ORM功能基本使用
使用 ORM/Schema Type/SQL ExpressionLanguage/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。
这边可以简单创建几个表:
#!/usr/bin/ env python
#coding=utf-8
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
engine = create_engine("mysql+mysqldb://root@localhost:3306/python", max_overflow=5)
Base = declarative_base()
# 创建单表
class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id', 'name', name='uix_id_name'),
Index('ix_id_name', 'name', 'extra'),
)
# 一对多
class Favor(Base):
__tablename__ = 'favor'
nid = Column(Integer, primary_key=True)
caption = Column(String(50), default='red', unique=True)
class Person(Base):
__tablename__ = 'person'
nid = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=True)
favor_id = Column(Integer, ForeignKey("favor.nid"))
# 多对多
class ServerToGroup(Base):
__tablename__ = 'servertogroup'
nid = Column(Integer, primary_key=True, autoincrement=True)
server_id = Column(Integer, ForeignKey('server.id'))
group_id = Column(Integer, ForeignKey('group.id'))
class Group(Base):
__tablename__ = 'group'
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True, nullable=False)
class Server(Base):
__tablename__ = 'server'
id = Column(Integer, primary_key=True, autoincrement=True)
hostname = Column(String(64), unique=True, nullable=False)
port = Column(Integer, default=22)
# Base.metadata.create_all(engine) #创建表
Base.metadata.drop_all(engine) #删除表
具体使用我们可以参考http://docs.sqlalchemy.org/en/latest/dialects/mysql.html