sqlalchemy
2016-04-22 09:52
323 查看
#!/usr/bin/env python #coding:utf8 from sqlalchemy import create_engine,and_,or_,func,Table from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String,ForeignKey from sqlalchemy.orm import sessionmaker,relationship Base=declarative_base() engine=create_engine("mysql+mysqldb://root@localhost:3306/xym",echo=False)#echo=True可以打印详细的原生SQL User2Group = Table('user2group_uc',Base.metadata, #多个用户对应多个组,同时多个组对应多个用户,多对多 Column('users_id',ForeignKey('users.id'),primary_key=True), Column('groups_id',ForeignKey('groups.id'),primary_key=True) ) Host2Group = Table('host2group_uc',Base.metadata, #多个主机对应多个组,同时多个组对应多个主机,多对多 Column('hosts_id',ForeignKey('hosts.id'),primary_key=True), Column('groups_id',ForeignKey('groups.id'),primary_key=True) ) class Host(Base): __tablename__ = 'hosts' id = Column(Integer,primary_key=True,autoincrement=True) hostname = Column(String(64),unique=True,nullable=False) ip_addr = Column(String(128),unique=True,nullable=False) port = Column(Integer,default=22) group = relationship('Group', #一个主机对应多个组,一个组对应多个主机,多对多,group表可以通过host_list字段找到group对应的主机,host表能通过group这个字段找到这个主机对应的group secondary=Host2Group, backref='host_list') #反向关联,从Group表往这里关联host_list字段,groups.host_list就能获取到group的所有主机 def __repr__(self): return "<hostname=%s, ip_addr=%s>" %(#如果没有定义repr,那么all返回的是所有的groups记录对应的sqlalchemy封装的表结构 self.hostname, self.ip_addr) class Group(Base): __tablename__ = 'groups' id = Column(Integer,primary_key=True) name = Column(String(64),unique=True,nullable=False) def __repr__(self): return "<name=%s>" %(self.name) class User(Base): __tablename__ = 'users' id = Column(Integer,primary_key=True) username = Column(String(64),unique=True,nullable=False) password = Column(String(255),nullable=False) group = relationship('Group', secondary=User2Group, backref='user_list') def __repr__(self): return "<username=%s,password=%s>" %(self.username,self.password) Base.metadata.create_all(engine)#创建所有表结构 SessionCls=sessionmaker(bind=engine)#创建于数据库的会话session class,这里返回的是session的class session=SessionCls() def create_database(): #########添加组######## dba_group=Group(name='dba') sys_group=Group(name='system') session.add_all([dba_group,sys_group]) session.commit() ##################添加主机##################### nginx_server=Host(hostname='nginx_server',ip_addr='192.168.20.136') lvs_server=Host(hostname='lvs_server',ip_addr='192.168.20.137') mysql_server=Host(hostname='mysql_server',ip_addr='192.168.20.138') redis_server=Host(hostname='redis_server',ip_addr='192.168.20.139',port=2211) session.add_all([nginx_server,lvs_server,mysql_server,redis_server]) session.commit() ####################添加用户################### user1=User(username='root',password='123456') user2=User(username='abc',password='123') session.add_all([user1,user2]) session.commit() ################Host2Group关联################ sys_groups=session.query(Group).filter(Group.name=='system').all() dba_groups=session.query(Group).filter(Group.name=='dba').all() nginx_server.group=sys_groups lvs_server.group=sys_groups mysql_server.group=dba_groups redis_server.group=dba_groups session.commit() #################User2Group################# user1.group=sys_groups user2.group=dba_groups session.commit() def Auth(username,password): #查询用户 result=session.query(User).filter(User.username==username,User.password==password).all() if result: print '[%s]:登录成功'%username #获取用户ID cuser_id=session.query(User).filter(User.username==username).first().id #获取组ID group_id = session.query(User2Group).filter(User2Group.c.users_id==cuser_id).first().groups_id #如果不是通过class创建的表,需要.c才能使用后面字段名 #获取组名 group_name=session.query(Group).filter(Group.id==group_id).first() print "[--{:^10}--]".format(group_name.name) for name in group_name.host_list: print name.hostname,name.ip_addr return True else: print '登录失败' return False
相关文章推荐
- 用distinct在MySQL中查询多条不重复记录值
- TimesTen 应用层数据库缓存学习:11. AWT性能监控
- Oracle flashback table简介
- Mybatis like 查询 防止SQL注入方法相关原理和解决方法整理
- mysql视图学习总结
- mysql教程导出数据库教程几种方法
- mysql 5.7 版本,密码无法登陆,更改密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'fie
- 附加数据库失败,sql2008,断电数据库日志受损
- ORACLE创建表空间和用户
- MySQL安装过程net start mysql 启动失败 报“错误2,系统找不到文件”的解决办法
- 青云 ubuntu下mysql远程连接配置
- plsql developer创建连接DBlinks
- ssh连接Linux导出oracle数据
- Oracle SQL日期比较和常用日期函数
- Oracle数据库存储过程使用中一些注意事项
- Mongodb aggregate group DBRef类型,并处理返回的DBRef数据Demo
- Redis监控技巧总结
- Oracle 修改表结构
- MySQL的limit优化
- ThinkPHP连接Oracle数据库