要使用SQLAlchemy,必须先下载这个模块
- pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->Project Interpreter-->右上+-->搜索你要安装的模块
- 源码安装,源码下载地址:https://www.oschina.net/news/84998/sqlalchemy-1-1-10
开始操作前,你必须清楚SQLAlchemy实现操作数据库的原理,SQLAlchemy本身是无法操作数据库的,必须通过第三库pymysql,而SQAlchemy内的Dialect就是用来和数据API进行交流的,实现过程就是利用python最为常用的类和对象来,一张表就是一个类,一行数据就是一个对象
了解到这,就是开始我们的实战吧!利用ORM(关系对象映射)创建表,分5步走
第一步:导模块
#导模块
#用于和数据库创建连接
from sqlalchemy import create_engine
#用于实例一个基类,创建表时必须继续这个父类
from sqlalchemy.ext.declarative import declarative_base
#导入表元素,列,数据类型,外键,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index
第二步:创建数据库连接
数据传入格式mysql
+
pymysql:
/
/
<username>:<password>@<host>
/
<dbname>[?<options>]
#连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db1",echo=True,max_overflow=5)
第三步:创建基类
创建表类时 ,必须继承这个类
#创建基类
Base = declarative_base()
第四步:创建表,记得要继承基类
#创建表类
class Users(Base):
__tablename__ = 'users'
nid = Column(Integer,primary_key=True)
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('nid','name',name='uix_nid_name'),
Index('ix_name_extra','name','extra'),
)
第五步:
#由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作
Base.metadata.create_all(engine)
全部代码:
# usr/bin/env python # -*- encoding:utf-8 -*- #导模块 #用于和数据库创建连接 from sqlalchemy import create_engine #用于实例一个基类,创建表时必须继续这个父类 from sqlalchemy.ext.declarative import declarative_base #导入表元素,列,数据类型,外键,索引.. from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index #连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块 engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5) #创建基类 Base = declarative_base() #创建表类 class Users(Base): __tablename__ = 'users' nid = Column(Integer,primary_key=True) name = Column(String(32)) extra = Column(String(16)) __table_args__ = ( UniqueConstraint('nid','name',name='uix_nid_name'), Index('ix_name_extra','name','extra'), ) #由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作 Base.metadata.create_all(engine)
一对多创建表,重点就是外键
#一对多
#外键关联的表要先创建
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 Group(Base):
__tablename__ = 'group'
nid = Column(Integer,primary_key=True)
name = Column(String(64),unique=True,nullable=False)
port = Column(Integer,default=22)
class Server(Base):
__tablename__ = 'server'
nid = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),unique=True,nullable=False)
class ServerToGroup(Base):
__tablename__ = 'servertogroup'
nid = Column(Integer,primary_key=True,autoincrement=True)
sever_id = Column(Integer,ForeignKey('server.nid'))
group_id = Column(Integer,ForeignKey('group.nid'))
删除所有的表
Base.metadata.drop_all(engine)
完整代码
# usr/bin/env python # -*- encoding:utf-8 -*- #导模块 #用于和数据库创建连接 from sqlalchemy import create_engine #用于实例一个基类,创建表时必须继续这个父类 from sqlalchemy.ext.declarative import declarative_base #导入表元素,列,数据类型,外键,索引.. from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index #连接数据库,在这里传入你要使用的数据库类型和第三方操作数据库的模块 engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5) #创建基类 Base = declarative_base() #创建表类 class Users(Base): __tablename__ = 'users' nid = Column(Integer,primary_key=True) name = Column(String(32)) extra = Column(String(16)) __table_args__ = ( UniqueConstraint('nid','name',name='uix_nid_name'), Index('ix_name_extra','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 Group(Base): __tablename__ = 'group' nid = Column(Integer,primary_key=True) name = Column(String(64),unique=True,nullable=False) port = Column(Integer,default=22) class Server(Base): __tablename__ = 'server' nid = Column(Integer,primary_key=True,autoincrement=True) hostname = Column(String(64),unique=True,nullable=False) class ServerToGroup(Base): __tablename__ = 'servertogroup' nid = Column(Integer,primary_key=True,autoincrement=True) sever_id = Column(Integer,ForeignKey('server.nid')) group_id = Column(Integer,ForeignKey('group.nid')) #由于上面只是在代码级别实现,还没真正的创建表,所有还需一个执行动作 def init_db(): Base.metadata.create_all(engine) def drop_db(): Base.metadata.drop_all(engine)
操作表
在操作之前,还需要做两步
第一步:导模块
#操作表时用到,sessionmaker用于实例操作表的对象,relationship在表类中定义,方便查询
from sqlalchemy.orm import sessionmaker,relationship
第二步:创建操作对象
Session = sessionmaker(bind=engine)
session = Session()
增 add add_all(列表)
#增
obj = Users(name='alex0',extra='sb')
session.add(obj)
session.add_all([
Users(name='alex1',extra='sb'),
Users(name='alex2',extra='sb')
])
session.commit()
删 delete
#删除
session.query(Users).filter(Users.nid>2).delete()
session.commit()
改 update
#改
session.query(Users).filter(Users.nid<2).update({Users.name:Users.name + '666'},synchronize_session=False)
session.commit()
查 filter filter_by
#查
r = session.query(Users).all()
print(r)
r2 = session.query(Users.name,Users.extra).all()
print(r2)
r3 = session.query(Users).filter_by(nid=2).all()
print(r3)
r4 = session.query(Users).filter_by(name='alex').first()
print(r4)