day13 SQLAlchemy
ORM:也叫关系对象映射
本篇要点:
- 原生模块 pymsql
- ORM框架 SQLAchemy
pymysql
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。
需要准备的环境:
- MySQL(服务端)
- pymysql(操作客户端)
- pymysql安装参考:http://www.cnblogs.com/woider/p/5926744.html
pymysql的使用操作:
- 执行SQL语句:
SQLAchemy
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
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> cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
- 创建表:
#!/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+pymysql://root:123456@10.70.18.100:3306/ttt",max_overflow=5) #连接数据库
Base = declarative_base()
#创建单表:
class Users(Base): #类必须要继承Base
__tablename__ = 'users' #表名
id = Column(Integer,primary_key=True) #创建列
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id','name',name='centos'), #联合索引
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")) #根上一个favor的nid做外键
#多对多
class ServerToGroup(Base):
__tablename__ = 'servertogroup'
id = Column(Integer,primary_key=True,autoincrement=True)
hostname = Column(String(64),unique=True,nullable=False) 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) # def init_db():
# Base.metadata.create_all(engine)
# init_db() #创建 def drop_db():
Base.metadata.drop_all(engine) drop_db() #删除
- 表操作(增删改查)
1.增加操作
#!/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+pymysql://root:123456@10.70.18.100:3306/ttt",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#创建单表:
class Users(Base): #类必须要继承Base
__tablename__ = 'users' #表名
id = Column(Integer,primary_key=True,autoincrement=True) #创建列
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id','name',name='centos'), #联合索引
Index('ix_id_name','name','extra'),
)
def init_db(): # 首先要创建单表
Base.metadata.create_all(engine)
init_db() #初始化表 Session = sessionmaker(bind=engine) #会话绑定
session = Session() obj = Users(name='wanghui',extra='ssss') #单条数据操作
session.add(obj) #增加单条数据
session.add_all([ #多条数据的增加
Users(name='xyz',extra='wsss'),
Users(name='sssd',extra='dadsad'),
Users(name='jack',extra='hello'),
Users(name='jack1',extra='hello'),
Users(name='jack2',extra='hello'),
Users(name='jack3',extra='hello')
])
session.commit() #提交
2.删除操作
#!/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+pymysql://root:123456@10.70.18.100:3306/ttt",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#创建单表:
class Users(Base): #类必须要继承Base
__tablename__ = 'users' #表名
id = Column(Integer,primary_key=True) #创建列
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id','name',name='centos'), #联合索引
Index('ix_id_name','name','extra'),
)
# def init_db(): # 首先要创建单表
# Base.metadata.create_all(engine)
# init_db() #初始化表 Session = sessionmaker(bind=engine) #会话绑定
session = Session()
session.query(Users).filter(Users.id > 2).delete() #删除的话也是根据条件进行伤处操作的
session.commit()
3.修改操作
#!/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+pymysql://root:123456@10.70.18.100:3306/ttt",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#创建单表:
class Users(Base): #类必须要继承Base
__tablename__ = 'users' #表名
id = Column(Integer,primary_key=True) #创建列
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id','name',name='centos'), #联合索引
Index('ix_id_name','name','extra'),
)
# def init_db(): # 首先要创建单表
# Base.metadata.create_all(engine)
# init_db() #初始化表 Session = sessionmaker(bind=engine) #会话绑定
session = Session()
session.query(Users).filter(Users.id > 2 ).update({'name':'099'})
session.query(Users).filter(Users.id > 2).update({Users.name:Users.name + '099'},synchronize_session = False)
session.commit()
4.查找操作
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/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+pymysql://root:123456@10.70.18.100:3306/ttt",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#创建单表:
class Users(Base): #类必须要继承Base
__tablename__ = 'users' #表名
id = Column(Integer,primary_key=True) #创建列
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id','name',name='centos'), #联合索引
Index('ix_id_name','name','extra'),
)
# def init_db(): # 首先要创建单表
# Base.metadata.create_all(engine)
# init_db() #初始化表 Session = sessionmaker(bind=engine) #会话绑定
session = Session()
ret1=session.query(Users).all() #查询全部
ret2=session.query(Users.name,Users.extra).all()
ret3=session.query(Users).filter_by(name='099099').all() #条件匹配查
ret4=session.query(Users).filter_by(name='099099').first()
print(ret1[0].name,ret1[0].id,ret1[0].extra) #获取第一行数据
print(ret1[1].name,ret1[1].id,ret1[1].extra) #获取第二行的数据
5.其他操作
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/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
from sqlalchemy import all_,and_,or_,not_ #导入条件判断语句 engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/ttt",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#创建单表:
class Users(Base): #类必须要继承Base
__tablename__ = 'users' #表名
id = Column(Integer,primary_key=True) #创建列
name = Column(String(32))
extra = Column(String(16))
__table_args__ = (
UniqueConstraint('id','name',name='centos'), #联合索引
Index('ix_id_name','name','extra'),
)
# def init_db(): # 首先要创建单表
# Base.metadata.create_all(engine)
# init_db() #初始化表 Session = sessionmaker(bind=engine) #会话绑定
session = Session() #条件
ret = session.query(Users).filter_by(name='wanghui').all() #条件过滤 (单个条件可以用filter_by)
#print(ret[0].name,ret[0].id,ret[0].extra) #打印查查找的数据信息
res = session.query(Users).filter_by(name='wanghui')
print(res) #打印操作的SQL语句
ret1 = session.query(Users).filter(Users.id > 1 , Users.name == 'wanghui').all() #匹配查询(多个条件就不用filter_by了)
#print(ret[0].name,ret[0].id,ret[0].extra)
ret2=session.query(Users).filter(Users.id.between(1,35),Users.name=='wanghui').all() #条件查询
ret3=session.query(Users).filter(Users.id.in_([1,34,40])).all()
ret4=session.query(Users).filter(~Users.id.in_([1,34,40])).all() #非操作
ret5=session.query(Users).filter(and_(Users.id > 3,Users.name=='wanghui')).all() #与操作
ret6=session.query(Users).filter(or_(Users.id > 3,Users.name=='wanghui')).all() #或操作
ret7=session.query(Users).filter(
or_(
Users.id > 2,
and_(Users.name == 'wanghui',Users.id > 10),
Users.extra != ''
)).all()
#通配符
ret8 = session.query(Users).filter(Users.name.like('e%')).all() #模糊匹配
ret9 = session.query(Users).filter(~Users.name.like('e%')).all() #模糊匹配
#限制
ret10 = session.query(Users).filter(Users.id)[1:2]
#排序
ret11 = session.query(Users).order_by(Users.extra.desc()).all() #desc表示逆序,asc表示顺序
ret12=session.query(Users).order_by(Users.name.desc(),Users.id.asc()).all()
#分组
from sqlalchemy.sql import func
ret13 = session.query(Users).group_by(Users.extra).all()
ret14 = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) > 2).all()
#连表操作
ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
ret = session.query(Person).join(Favor).all()
ret = session.query(Person).join(Favor, isouter=True).all()
# 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
连表操作:
为什么要分表:
解决数据冗余的问题
约束问题:外键
单表查询:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8') #连接数据库
# engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#建表
class Test(Base):
__tablename__='test'
nid=Column(Integer,primary_key=True,autoincrement=True)
name=Column(String(32)) #一对多表
class Group(Base):
__tablename__='group'
nid=Column(Integer,primary_key=True,autoincrement=True)
caption=Column(String(32)) class User(Base):
__tablename__='user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32))
group_id=Column(Integer,ForeignKey(Group.nid)) #和group的id建立关系
def __repr__(self): #当加入repr定义的字符格式的时候会把非映射关系的数据按照tmp定义的格式输出
tmp = '%s - %s - %s'%(self.nid,self.username,self.group_id)
return tmp #生成表
def init_db():
Base.metadata.create_all(engine)
init_db() Session = sessionmaker(bind=engine) #会话绑定
session = Session() session.add_all([ #插入组数据
Group(caption='DBA'),
Group(caption='OPS')
])
session.add_all([ #插入用户数据
User(username='alex',group_id=1),
User(username='wanghui',group_id=2)
])
session.commit()
ret=session.query(User).filter(User.username=='wanghui').all() #将收集的数据存储成为一个list对象
print(ret)
obj=ret[0]
print(obj)
print(obj.username)
print(obj.group_id)
print(obj.nid)
ret1=session.query(User.username).all() #这样的话可以直接获取数据(加上映射之后就可以取到数据了)
print(ret1)
正向查找:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8') #连接数据库
# engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#建表
class Test(Base):
__tablename__='test'
nid=Column(Integer,primary_key=True,autoincrement=True)
name=Column(String(32)) #一对多表
class Group(Base):
__tablename__='group'
nid=Column(Integer,primary_key=True,autoincrement=True)
caption=Column(String(32)) class User(Base):
__tablename__='user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32))
group_id=Column(Integer,ForeignKey(Group.nid)) #和group的id建立关系
group=relationship('Group',backref='uuu') #解决查询时候的连表关系,
def __repr__(self): #当加入repr定义的字符格式的时候会把非映射关系的数据按照tmp定义的格式输出
tmp = '%s - %s - %s'%(self.nid,self.username,self.group_id)
return tmp #生成表
def init_db():
Base.metadata.create_all(engine)
init_db() Session = sessionmaker(bind=engine) #会话绑定
session = Session() # session.add_all([ #插入组数据
# Group(caption='DBA'),
# Group(caption='OPS')
# ])
# session.add_all([ #插入用户数据
# User(username='alex',group_id=1),
# User(username='wanghui',group_id=2)
# ])
# session.commit()
#连表操作
#正向查询方式
ret=session.query(User).all()
for obj in ret: #obj代指user表的nid,obj
print(obj.nid,obj.username,obj.group_id,obj.group.nid,obj.group.caption)
反向查找:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8') #连接数据库
# engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#建表
class Test(Base):
__tablename__='test'
nid=Column(Integer,primary_key=True,autoincrement=True)
name=Column(String(32)) #一对多表
class Group(Base):
__tablename__='group'
nid=Column(Integer,primary_key=True,autoincrement=True)
caption=Column(String(32)) class User(Base):
__tablename__='user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32))
group_id=Column(Integer,ForeignKey(Group.nid)) #和group的id建立关系
group=relationship('Group',backref='uuu') #解决查询时候的连表关系,
def __repr__(self): #当加入repr定义的字符格式的时候会把非映射关系的数据按照tmp定义的格式输出
tmp = '%s - %s - %s'%(self.nid,self.username,self.group_id)
return tmp #生成表
# def init_db():
# Base.metadata.create_all(engine)
# init_db()
#
Session = sessionmaker(bind=engine) #会话绑定
session = Session()
#
# session.add_all([ j #插入组数据
# Group(caption='DBA'),
# Group(caption='OPS')
# ])
# session.add_all([ #插入用户数据
# User(username='alex',group_id=1),
# User(username='wanghui',group_id=2)
# ])
# session.commit()
#连表操作
# sql=session.query(User.username,Group.caption).join(Group,isouter=True).filter(Group.caption=='DBA')
# print(sql)
# ret=session.query(User.username,Group.caption).join(Group,isouter=True).filter(Group.caption=='DBA').all() #isouter:表示left JOIN
# print(ret)
#反向查询
res=session.query(Group).filter(Group.caption=='DBA').first()
print(res.nid)
print(res.caption)
print(res.uuu)
多对多数据创建与操作:
多对多使用背景:
多机器,多用户,多权限
类似于下图的格式:
对于主机c1来说都存在与之对应的服务器用户,所以要建立用户和服务器指之间的关联关系,就要出现一张新的表来对应他们之间的关系表:
外键约束;
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8') #连接数据库
# engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#建表
class Group(Base):
__tablename__='group'
nid=Column(Integer,primary_key=True,autoincrement=True)
caption=Column(String(32)) class User(Base):
__tablename__='user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32))
group_id=Column(Integer,ForeignKey(Group.nid)) #和group的id建立关系
group=relationship('Group',backref='uuu') #解决查询时候的连表关系,
def __repr__(self): #当加入repr定义的字符格式的时候会把非映射关系的数据按照tmp定义的格式输出
tmp = '%s - %s - %s'%(self.nid,self.username,self.group_id)
return tmp class Host(Base):
__tablename__='host'
nid=Column(Integer,primary_key=True,autoincrement=True)
hostname=Column(String(32))
port=Column(String(32))
ip=Column(String(32)) class HostUser(Base):
__tablename__='host_user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32)) class HostToHostUser(Base):
__tablename__ = 'host_to_host_user'
nid=Column(Integer,primary_key=True,autoincrement=True)
host_id=Column(Integer,ForeignKey('host.nid'))
host_user_id=Column(Integer,ForeignKey('host_user.nid')) #创建表
# def init_db():
# Base.metadata.create_all(engine)
# init_db()
Session=sessionmaker(bind=engine)
session=Session()
#创建数据
# session.add_all([
# Host(hostname='c1',port=22,ip='192.168.1.1'),
# Host(hostname='c2',port=22,ip='192.168.1.2'),
# Host(hostname='c3',port=22,ip='192.168.1.3'),
# Host(hostname='c4',port=22,ip='192.168.1.4'),
# Host(hostname='c5',port=22,ip='192.168.1.5'),
# ])
# session.add_all([
# HostUser(username='root'),
# HostUser(username='wanghui'),
# HostUser(username='zzd'),
# HostUser(username='ys'),
# ])
#创建对应关系数据
# session.add_all([
# HostToHostUser(host_id=1,host_user_id=1),
# HostToHostUser(host_id=1,host_user_id=2),
# HostToHostUser(host_id=1,host_user_id=3),
# HostToHostUser(host_id=2,host_user_id=1),
# HostToHostUser(host_id=2,host_user_id=2),
# HostToHostUser(host_id=2,host_user_id=3),
# ])
# session.commit()
#获取主机1中的用户数据
推荐方式:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index,Table
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8') #连接数据库
# engine = create_engine("mysql+pymysql://root:123456@10.70.18.100:3306/zzz",max_overflow=5,encoding='utf-8', echo=True) #连接数据库
Base = declarative_base()
#建表
class Group(Base):
__tablename__='group'
nid=Column(Integer,primary_key=True,autoincrement=True)
caption=Column(String(32)) class User(Base):
__tablename__='user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32))
group_id=Column(Integer,ForeignKey(Group.nid)) #和group的id建立关系
group=relationship('Group',backref='uuu') #解决查询时候的连表关系,
def __repr__(self): #当加入repr定义的字符格式的时候会把非映射关系的数据按照tmp定义的格式输出
tmp = '%s - %s - %s'%(self.nid,self.username,self.group_id)
return tmp class HostToHostUser(Base): #关系表
__tablename__ = 'host_to_host_user'
nid=Column(Integer,primary_key=True,autoincrement=True) #自己的主键
host_id=Column(Integer,ForeignKey('host.nid')) #创建host外键
host_user_id=Column(Integer,ForeignKey('host_user.nid')) #创建user外键 class Host(Base):
__tablename__='host'
nid=Column(Integer,primary_key=True,autoincrement=True)
hostname=Column(String(32))
port=Column(String(32))
ip=Column(String(32))
host_user=relationship('HostUser',secondary=HostToHostUser.__table__,backref='host_list') #正向查找和反向查找 class HostUser(Base):
__tablename__='host_user'
nid=Column(Integer,primary_key=True,autoincrement=True)
username=Column(String(32)) #创建表
# def init_db():
# Base.metadata.create_all(engine)
# init_db()
Session=sessionmaker(bind=engine)
session=Session()
#创建host数据
# session.add_all([
# Host(hostname='c1',port=22,ip='192.168.1.1'),
# Host(hostname='c2',port=22,ip='192.168.1.2'),
# Host(hostname='c3',port=22,ip='192.168.1.3'),
# Host(hostname='c4',port=22,ip='192.168.1.4'),
# Host(hostname='c5',port=22,ip='192.168.1.5'),
# ])
#插入用户
# session.add_all([
# HostUser(username='root'),
# HostUser(username='wanghui'),
# HostUser(username='zzd'),
# HostUser(username='ys'),
# ])
#创建对应关系数据
# session.add_all([
# HostToHostUser(host_id=1,host_user_id=1),
# HostToHostUser(host_id=1,host_user_id=2),
# HostToHostUser(host_id=1,host_user_id=3),
# HostToHostUser(host_id=2,host_user_id=1),
# HostToHostUser(host_id=2,host_user_id=),
# HostToHostUser(host_id=2,host_user_id=3),
# ])
# session.commit()
host_obj=session.query(Host).filter(Host.hostname=='c1').first()
print(host_obj.host_user)
整体思想
1.创建表和操作表
2.操作表:
单表操作:转换操作
连表操作:.join
创建关系:
一对多:正向查找,反向查找
多对多:多一张关系表
day13 SQLAlchemy的更多相关文章
- python_way day13 sqlalchemy
sqlalchemy 一对多 多对多 1.一对多 一.#创建表结构 class Host(Base): #所有的子类都继承这个基类 #创建表结构 __tablename__ = 'hosts' id ...
- Day13 SQLAlchemy连表操作和堡垒机
一.数据库操作 1.创建表.插入数据和一对多查询 #!/usr/bin/env python # -*- coding: utf-8 -*- # Author: wanghuafeng from sq ...
- Python学习-day13 SqlAlchemy
本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 orm英文全称object relational mapping ...
- SQLALchemy(连表)、paramiko
本节内容:
- python运维开发(十三)----SQLalchemy和paramiko续
内容目录: ORM架构SQLalchemy Paramiko SQLalchemy对表的操作 使用 ORM/Schema Type/SQL Expression Language/Engine/Con ...
- Part01、sqlalchemy 使用
一.ORM 连表 一对多 1.创建表,主动指定外键约束. 2.操作. ...
- sqlalchemy学习
sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)
第十二章 mysql ORM介绍 2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...
随机推荐
- 【python之路42】web框架们的具体用法
Python的WEB框架 (一).Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. p ...
- 20190817-T1-LOJ6322「雅礼国庆 2017 Day6」Star Way To Heaven
写这篇题解是因为作者太蒻已经忘了最小生成树了. <题面> 这个题还真是想不到最小生成树. $80\%$算法 复杂度:$\Theta(k^2 \log N )$ 用了二分答案(明显答案具有单 ...
- JPinyin繁体相互转换
// 用正则表达式"[\u4e00-\u9fa5]"匹配 字符串 Scanner sc =new Scanner(System.in);System.out.println(&qu ...
- 第一篇:前端知识之HTML内容
HTTP协议介绍 什么是HTTP协议 超文本传输协议,规定了浏览器与服务端之间数据传输的格式. HTTP协议的四大特性 基于请求响应 一次请求对应一次响应 基于TCP/IP作用于应用层之上的协议 无状 ...
- Spring的IoC容器(转)BeanFactory
Spring的IoC容器 Spring读书笔记-----Spring的Bean之Bean的基本概念 加菲猫 Just have a little faith. Spring的IoC容器 (用户持久化类 ...
- Django 使用模板页面,块标签,模型
1.Django 使用模板页面 Django对于成体系的页面提出了模板继承和模板加载的方式. 1.导入静态页面 2.导入静态文件(css,js,images) 3.修改页面当中的静态地址 1.sett ...
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
- python基础--数据类型的常用方法2
列表及内置方法: count():查询元素的个数 clear():清空当前对象 reverse():对当前对象进行反转 sort():对当前对象中的元素进行排序 总结: 能存多个值 有序的 可变的 队 ...
- 哈哈哈哈,我竟然发现了个MSDN里面的笔误
typedef __PROCESSOR_INFO { WORD wVersion; WCHAR szProcessorCore[40]; WORD wCoreRevision; WCHAR ...
- wordpress设置一个特定的页面作为首页
首先在"页面"里新建一个页面,比如标题为"welcome"; 然后在设置里找到"阅读",首页显示调整为"一个静态页面", ...