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 ...
随机推荐
- Qt运行不出现界面
安装Qt之后按照例程运行,结果不出现界面,原因是路径中有中文,将中文全部改成英文之后,问题解决.
- 关于parseInt进行进制的转换
["1", "2", "3"].map(parseInt) 答案是多少? 考察点:1 . ES5的map方法,接收参数并且callback计 ...
- 关于 matplotlib
注意,需要 zlib, 需要 Tkinter pip install matplotlib import numpy as np import matplotlib.pyplot as plt plt ...
- Cesium 1.50重量级新功能测评
概要 既Cesium 1.49中3dtile加载性能大幅提升以后,Cesium 1.50再次迎来几个重量级新功能: 1 地球裁切,这下相当于可以截取一部分地形影像数据,当作一个平面场景来用了! 2 射 ...
- 群晖安装transmission
首先 需要添加第三方的套件下载地址 http://packages.synocommunity.com/ 然后找到tr 根据需要设置文件夹路径 因为我需要跑rss,所以用到了flexget,先放这里 ...
- neo4j批量导入neo4j-import
neo4j数据批量导入 1 neo4j基本参数 1.1 启动与关闭: 1.2 neo4j-admin的参数:控制内存 1.2.1 memrec 是查看参考内存设置 1.2.2 指定缓存–pagecac ...
- db link的查看创建与删除 1
1.查看dblink select owner,object_name from dba_objects where object_type='DATABASE LINK'; 或者 select * ...
- 【洛谷】 P1420 最长连号
题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入输出格式 输入格式: 第一行,一个数n; 第二行,n个正整数,之间用空格隔 ...
- Leetcode643.Maximum Average Subarray I子数组的最大平均数1
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例 1: 输入: [1,12,-5,-6,50,3], k = 4 输出: 12.75 解释: 最大平均数 (12- ...
- Spring使用JDBC配置具名参数
好处:若有多个参数,则不用再去对应位置?,直接对应参数名,便于维护 缺点:较为麻烦 使用具名参数时可以使用以下的方法 好处,通过实现类BeanPropertySqlParameterSource之间传 ...