python營運開發(十三)----SQLalchemy和paramiko續

來源:互聯網
上載者:User

標籤:

內容目錄:

ORM架構SQLalchemy

Paramiko

SQLalchemy對錶的操作

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有組件對資料進行操作。根據類建立對象,對象轉換成SQL,執行SQL。

1、建立表

# 單表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 = relationship("Group", backref=‘uuu‘)    def __repr__(self):        temp = "%s - %s: %s" %(self.nid, self.username, self.group_id)        return temp#多對多class Host(Base): # metaclass,Host.table對象    __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, backref=‘h‘)    host_user = relationship(‘HostUser‘, secondary=HostToHostUser.__table__, backref=‘h‘)class HostUser(Base):    __tablename__ = ‘host_user‘    nid = Column(Integer, primary_key=True,autoincrement=True)    username = Column(String(32))def init_table():    Base.metadata.create_all(engine)def drop_table():    Base.metadata.drop_all(engine)init_table()Session  = sessionmaker(bind=engine)session = Session()

2、動作表

增加操作

# 方法1session.add(Group(caption=‘DBA‘))session.add(Group(caption=‘SA‘))session.commit()# 方法2session.add_all([    User(username=‘jabe1‘,group_id = 1),    User(username=‘jabe2‘,group_id = 2)])session.commit()

刪除表資料操作

session.query(Users).filter(Users.id > 2).delete()session.commit()

修改表記錄操作  

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.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")session.commit()

查詢操作

#條件查詢ret = session.query(User).filter(User.username == ‘jabe1‘).all()print(ret)#單表查詢ret = session.query(User).all()obj = ret[0]print(ret)print(obj)print(obj.nid)print(obj.username)print(obj.group_id)#關聯查詢sql = session.query(User).join(Group,isouter=True)print(sql)ret = session.query(User).join(Group,isouter=True).all()print(ret)# sql = session.query(User.username,Group.caption).join(Group,isouter=True)# print(sql)# ret = session.query(User.username,Group.caption).join(Group,isouter=True).all()# print(ret)#原始方式(查詢使用者名稱稱和使用者組)# ret = session.query(User.username,Group.caption).join(Group,isouter=True).all()# print(ret)#新方式正向查詢# ret = session.query(User).all()# for obj in ret:#     #obj代指user表每一行資料#     #obj.group 代指group對象#     print(obj.nid,obj.username,obj.group_id,obj.group,obj.group.nid,obj.group.caption)#原始方式(查詢所有屬於DBA組的使用者)ret = session.query(User.username,Group.caption).join(Group,isouter=True).filter(Group.caption == ‘DBA‘).all()print(ret)#新方式(反向查詢)obj = session.query(Group).filter(Group.caption == ‘DBA‘).first()print(obj.nid)print(obj.caption)rint(obj.uuu)  

附加

# 條件ret = session.query(Users).filter_by(name=‘alex‘).all()ret = session.query(Users).filter(Users.id > 1, Users.name == ‘eric‘).all()ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == ‘eric‘).all()ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name=‘eric‘))).all()from sqlalchemy import and_, or_ret = session.query(Users).filter(and_(Users.id > 3, Users.name == ‘eric‘)).all()ret = session.query(Users).filter(or_(Users.id < 2, Users.name == ‘eric‘)).all()ret = session.query(Users).filter(    or_(        Users.id < 2,        and_(Users.name == ‘eric‘, Users.id > 3),        Users.extra != ""    )).all()# 萬用字元ret = session.query(Users).filter(Users.name.like(‘e%‘)).all()ret = session.query(Users).filter(~Users.name.like(‘e%‘)).all()# 限制ret = session.query(Users)[1:2]# 排序ret = session.query(Users).order_by(Users.name.desc()).all()ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()# 分組from sqlalchemy.sql import funcret = session.query(Users).group_by(Users.extra).all()ret = session.query(    func.max(Users.id),    func.sum(Users.id),    func.min(Users.id)).group_by(Users.name).all()ret = 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()
其他

  

Paramiko  

 Bastion Host

Bastion Host執行流程:

  1. 管理員為使用者在伺服器上建立帳號(將公開金鑰放置伺服器,或者使用使用者名稱密碼)
  2. 使用者登陸Bastion Host,輸入Bastion Host使用者名稱密碼,現實目前使用者管理的伺服器列表
  3. 使用者選擇伺服器,並自動登陸
  4. 執行操作並同時將使用者操作記錄

註:配置.brashrc實現ssh登陸後自動執行指令碼,如:/usr/bin/python /tmp/s13/day13/s7.py

 練習代碼:

import paramikoimport sysimport osimport socketimport getpassfrom paramiko.py3compat import u# windows does not have termios...try:    import termios    import tty    has_termios = Trueexcept ImportError:    has_termios = Falsedef interactive_shell(chan):    if has_termios:        posix_shell(chan)    else:        windows_shell(chan)def posix_shell(chan):    import select    oldtty = termios.tcgetattr(sys.stdin)    try:        tty.setraw(sys.stdin.fileno())        tty.setcbreak(sys.stdin.fileno())        chan.settimeout(0.0)        log = open(‘handle.log‘, ‘a+‘, encoding=‘utf-8‘)        flag = False        temp_list = []        while True:            r, w, e = select.select([chan, sys.stdin], [], [])            if chan in r:                try:                    x = u(chan.recv(1024))                    if len(x) == 0:                        sys.stdout.write(‘\r\n*** EOF\r\n‘)                        break                    if flag:                        if x.startswith(‘\r\n‘):                            pass                        else:                            temp_list.append(x)                        flag = False                    sys.stdout.write(x)                    sys.stdout.flush()                except socket.timeout:                    pass            if sys.stdin in r:                x = sys.stdin.read(1)                import json                if len(x) == 0:                    break                if x == ‘\t‘:                    flag = True                else:                    temp_list.append(x)                if x == ‘\r‘:                    log.write(‘‘.join(temp_list))                    log.flush()                    temp_list.clear()                chan.send(x)    finally:        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)def windows_shell(chan):    import threading    sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n")    def writeall(sock):        while True:            data = sock.recv(256)            if not data:                sys.stdout.write(‘\r\n*** EOF ***\r\n\r\n‘)                sys.stdout.flush()                break            sys.stdout.write(data)            sys.stdout.flush()    writer = threading.Thread(target=writeall, args=(chan,))    writer.start()    try:        while True:            d = sys.stdin.read(1)            if not d:                break            chan.send(d)    except EOFError:        # user hit ^Z or F6        passdef run():    default_username = getpass.getuser()    username = input(‘Username [%s]: ‘ % default_username)    if len(username) == 0:        username = default_username    hostname = input(‘Hostname: ‘)    if len(hostname) == 0:        print(‘*** Hostname required.‘)        sys.exit(1)    tran = paramiko.Transport((hostname, 22,))    tran.start_client()    default_auth = "p"    auth = input(‘Auth by (p)assword or (r)sa key[%s] ‘ % default_auth)    if len(auth) == 0:        auth = default_auth    if auth == ‘r‘:        default_path = os.path.join(os.environ[‘HOME‘], ‘.ssh‘, ‘id_rsa‘)        path = input(‘RSA key [%s]: ‘ % default_path)        if len(path) == 0:            path = default_path        try:            key = paramiko.RSAKey.from_private_key_file(path)        except paramiko.PasswordRequiredException:            password = getpass.getpass(‘RSA key password: ‘)            key = paramiko.RSAKey.from_private_key_file(path, password)        tran.auth_publickey(username, key)    else:        pw = getpass.getpass(‘Password for %[email protected]%s: ‘ % (username, hostname))        tran.auth_password(username, pw)    # 開啟一個通道    chan = tran.open_session()    # 擷取一個終端    chan.get_pty()    # 啟用器    chan.invoke_shell()    interactive_shell(chan)    chan.close()    tran.close()if __name__ == ‘__main__‘:    run()

 

參考url:http://www.cnblogs.com/wupeiqi/articles/5699254.html

python營運開發(十三)----SQLalchemy和paramiko續

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.