Python的ORM框架SQLAlchemy

    今天主要是通过Python来对Mysql数据库进行操作,以及通过paramiko模块远程对主机进行操作,下面开始介绍今天的内容。

一、通过pymsql对数据库进行操作

    pymysql是Python中操作MySQL模块,其使用方法和MySQLdb几乎相同。

1、下载安装:
1
2
3
4
#源码安装:
   https: / / pypi.python.org / pypi / PyMySQL3
#pip安装:
   pip install pymysql
2、执行SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Author:HaiFeng Di
 
 
import pymysql
 
#创建连接
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
#创建游标
cursor = conn.cursor()
 
#执行SQL语句,并返回受影响的行数
 
#单条数据更新操作
# effect_row = cursor.execute("update hosts set host = '192.168.1.8'")
 
#添加where条件
# effect_row = cursor.execute("update hosts set host = '192.168.1.8' where id > %s",(1,))
 
#插入多条数据
effect_row = cursor.executemany( "insert into hosts(id,host)values(%s,%s)" , [( 6 , "192.168.1.9" ),( 7 , "192.168.1.10" )])
 
#提交,不然无法保存新建或者修改过的数据
conn.commit()
 
#关闭游标
cursor.close()
 
#关闭连接
conn.close()
3、获取新创建数据自增ID
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import pymysql
 
#创建连接
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
#创建游标
cursor = conn.cursor()
 
#插入多条数据
effect_row = cursor.executemany( "insert into hosts(id,host)values(%s,%s)" , [( 6 , "192.168.1.9" ),( 7 , "192.168.1.10" )])
 
#提交,不然无法保存新建或者修改过的数据
conn.commit()
 
#关闭游标
cursor.close()
 
#关闭连接
conn.close()
 
#获取最新自增ID
new_id = cursor.lastrowid
print (new_id)
4、获取查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import pymysql
 
#创建连接
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
#创建游标
cursor = conn.cursor()
 
cursor.execute( "select * from hosts" )
 
# 获取第一行数据
# row_1 = cursor.fetchone()
# print(row_1)         #获取的结果以元组方式展示
 
# 获取前n行数据
# row_2 = cursor.fetchmany(3)
# print(row_2)
 
# 获取所有数据
row_3 = cursor.fetchall()
print (row_3)
 
#提交,不然无法保存新建或者修改过的数据
conn.commit()
 
#关闭游标
cursor.close()
 
#关闭连接
conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode='relative')     #相对当前位置移动;

  • cursor.scroll(2,mode='absolute')   #相对绝对位置移动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
 
import pymysql
 
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
cursor = conn.cursor()
 
cursor.execute( "select * from hosts" )
 
cursor.scroll( 4 ,mode = 'relative' )    
# cursor.scroll(4,mode='absolute')  
row_1 = cursor.fetchone()
print (row_1)
 
conn.commit()
cursor.close()
conn.close()
5,fetch数据类型

    关于默认获取的数据类型是元组类型,如果想要转换成字典类型方便处理,请看下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
 
import pymysql
 
conn = pymysql.connect(host = '127.0.0.1' ,port = 3306 ,user = 'root' ,passwd = '123456' ,db = 'mydata' )
 
cursor = conn.cursor()
 
# 游标设置为字典类型
cursor = conn.cursor(cursor = pymysql.cursors.DictCursor)
cursor.execute( "select * from hosts" )
row_1 = cursor.fetchone()
print (row_1)
 
conn.commit()
cursor.close()
conn.close()
 
#结果:
{ 'id' : 1 , 'host' : '192.168.10.131' }

二、Python的ORM框架-SQLAlchemy

    SQLAlchemy是Python世界中最广泛使用的ORM工具之一,它采用了类似与Java里Hibernate的数据映射模型,而不是其他ORM框架采用的Active Record模型,SQLAlchemy分为两部分,一个是常用的ORM对象映射,另一个是核心的SQL expression。第一个很好理解,纯粹的ORM,后面这个不是ORM,而是DBAPI的封装,通过一些sql表达式来避免了直接写sql语句。简单的概括一下就是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

 下面来一下看一下SQLAlchemy的ORM的实现机制,内部封装了些什么:


 上图中的Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
1、底层处理

    使用Engine、ConnectionPooling、Dialect进行数据库操作,Engine使用ConnectionPooling连接数据库,然后再通过Dialect执行SQL语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from sqlalchemy import create_engine
 
 
engine = create_engine( "mysql+pymysql://root:123456@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#执行SQL
cur = engine.execute(
      "INSERT INTO hosts (id,host) VALUES ('1.1.1.22', 8)"
  )
 
# 新插入行自增ID
# cur.lastrowid
 
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES(%s, %s)",[('1.1.1.22', 3),('1.1.1.221', 3),]
# )
 
 
# 执行SQL
# cur = engine.execute(
#     "INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)",
#     host='1.1.1.99', color_id=3
# )
 
# 执行SQL
# cur = engine.execute('select * from hosts')
# 获取第一行数据
# cur.fetchone()
# 获取第n行数据
# cur.fetchmany(3)
# 获取所有数据
# cur.fetchall()

     这种方法底层实际是调用了上面的pymysql模块,没有实现通过实例化对象来对数据库进行操作。

2、ORM功能使用

    使用ORM、Schema Type、SQL Expression Language、Engine、ConnectionPooling、Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

创建表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/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:123@127.0.0.1:3306/t1" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'                 #表名
     id = Column(Integer, primary_key = True )  #表结构
     name = Column(String( 32 ))
     extra = Column(String( 16 ))
 
     __table_args__ = (                      #设置索引
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         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" ))
 
 
# 多对多
class Group(Base):
     __tablename__ = 'group'
     id = Column(Integer, primary_key = True )
     name = Column(String( 64 ), unique = True , nullable = False )
     port = Column(Integer, default = 22 )
 
 
class Server(Base):
     __tablename__ = 'server'
 
     id = 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 )
     server_id = Column(Integer, ForeignKey( 'server.id' ))
     group_id = Column(Integer, ForeignKey( 'group.id' ))
 
 
def init_db():
     """
     创建表
     :return:
     """
     Base.metadata.create_all(engine)
 
 
def drop_db():
     """
     删除表
     :return:
     """
     Base.metadata.drop_all(engine)
init_db()

操作表:

下面例子主要以单表操作为例,分别对数据库进行增删改查,请看下例:

  • 增加数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/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@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'                   
     id = Column(Integer, primary_key = True )    
     name = Column(String( 32 ))
 
     __table_args__ = (                        
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建DBSession类型:
DBSession = sessionmaker(bind = engine)
 
#创建session对象:
session = DBSession()
 
# 创建新User对象:
# new_user = Users(id='1', name='Bob')
#
# 添加到一条session:
# session.add(new_user)
 
#添加多条数据
session.add_all([
     Users( id = "2" , name = 'jack' ),
     Users( id = "3" , name = 'eric' ),
])
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 删除数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key = True )
     name = Column(String( 32 ))
 
     __table_args__ = (
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建DBSession类型:
DBSession = sessionmaker(bind = engine)
 
#创建session对象:
session = DBSession()
 
#删除id大于1的数据
session.query(Users). filter (Users. id > 1 ).delete()
 
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 修改数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/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@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key = True )
     name = Column(String( 32 ))
 
     __table_args__ = (
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建DBSession类型:
DBSession = sessionmaker(bind = engine)
 
#创建session对象:
session = DBSession()
 
 
# session.query(Users).filter(Users.id > 2).update({"name" : "henry"})
 
#修改id号,让其加99,结果id号为102
# session.query(Users).filter(Users.id > 2).update({Users.id: Users.id + "099"}, synchronize_session=False)
 
session.query(Users). filter (Users. id > 2 ).update({ "id" : Users. id + 1 }, synchronize_session = "evaluate" )
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/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@127.0.0.1:3306/mydata" , max_overflow = 5 )
 
#创建对象的基类
Base = declarative_base()
 
# 创建单表
class Users(Base):
     __tablename__ = 'users'
     id = Column(Integer, primary_key = True )
     name = Column(String( 32 ))
 
     __table_args__ = (
     UniqueConstraint( 'id' , 'name' , name = 'uix_id_name' ),
         Index( 'ix_id_name' , 'name' ),
     )
 
def init_db():
     Base.metadata.create_all(engine)
 
 
#创建session对象:
Session = sessionmaker(bind = engine)
session = Session()
#
# for name in session.query(Users).all():
#     print(name)
# ret = session.query(Users.id, Users.name).all()
# ret = session.query(Users).filter_by(name='jack').all()
ret = session.query(Users).filter_by(name = 'bob' ).first()
print (ret. id ,ret.name)
 
# 提交即保存到数据库:
session.commit()
 
# 关闭session:
session.close()
  • 更多数据库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 条件
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 func
 
ret = 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 ()

参考链接:

    http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html 

    http://www.pycoding.com/2016/03/07/sqlalchemy.html

三、Paramiko模块

    parmiko模块,基于SSH协议,用于链接远程服务器并执行相关操作。

1,安装使用

Paramiko安装很简单,可以使用pip直接安装:pip3 install paramiko,下面主要介绍一下如何使用:

SSHclient:用于连接远程服务器并执行基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
###############################基于用户名密码连接##############################
 
import paramiko
 
#创建SSH对象
ssh = paramiko.SSHClient()
 
#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
#连接服务器
ssh.connect(hostname = '192.168.10.131' ,port = 22 ,username = 'haifeng' ,password = 'haifeng' )
 
#执行命令
stdin,stdout,stderr = ssh.exec_command( 'ls' )
 
#获取命令返回结果
result = stdout.readlines()
print (result)
 
#关闭连接
ssh.close()
 
#结果:
[ 'Desktop\n' , 'Documents\n' , 'Downloads\n' , 'examples.desktop\n' , 'memcached-1.4.29\n' , 'Music\n' , 'netdata-1.0.0\n' , 'netdata-1.0.0_(1).tar.gz\n' , 'Pictures\n' , 'Public\n' , 'python_script\n' , 'redis-3.0.6\n' , 'redis-3.0.6.tar.gz\n' , 'Templates\n' , 'Videos\n' ]

SSHclient封装Transport:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import paramiko
 
transport = paramiko.Transport(( '192.168.10.131' , 22 ))
transport.connect(username = 'haifeng' , password = 'haifeng' )
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command( 'df' )
print (stdout.read())
 
transport.close()
 
#结果:
b 'Filesystem     1K-blocks    Used Available Use% Mounted on\nudev              484420       0    484420   0% /dev\ntmpfs             100748   11616     89132  12% /run\n/dev/sda1       19478204 5967848  12497876  33% /\ntmpfs             503728     352    503376   1% /dev/shm\ntmpfs               5120       4      5116   1% /run/lock\ntmpfs             503728       0    503728   0% /sys/fs/cgroup\ntmpfs             100748      56    100692   1% /run/user/1000\n'

基于公钥密钥连接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import paramiko
   
private_key = paramiko.RSAKey.from_private_key_file( '/home/auto/.ssh/id_rsa' )
   
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname = 'c1.salt.com' , port = 22 , username = 'wupeiqi' , key = private_key)
   
# 执行命令
stdin, stdout, stderr = ssh.exec_command( 'df' )
# 获取命令结果
result = stdout.read()
   
# 关闭连接
ssh.close()

SSHclient封装Transport:

1
2
3
4
5
6
7
8
9
10
11
12
13
import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file( '/home/auto/.ssh/id_rsa' )
 
transport = paramiko.Transport(( 'hostname' , 22 ))
transport.connect(username = 'wupeiqi' , pkey = private_key)
 
ssh = paramiko.SSHClient()
ssh._transport = transport
 
stdin, stdout, stderr = ssh.exec_command( 'df' )
 
transport.close()

SFTPClient:用于连接远程服务器并执行上传下载操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
###############################基于用户名密码上传下载###########################
  
import paramiko
   
transport = paramiko.Transport(( '192.168.10.131' , 22 ))
transport.connect(username = 'haifeng' ,password = 'haifeng' )
   
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put( '/tmp/location.py' , '/tmp/test.py' )
# 将remove_path 下载到本地 local_path
sftp.get( 'remove_path' , 'local_path' )
   
transport.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
###############################基于公钥密钥上传下载##############################
 
import paramiko
   
private_key = paramiko.RSAKey.from_private_key_file( '/home/auto/.ssh/id_rsa' )
   
transport = paramiko.Transport(( 'hostname' , 22 ))
transport.connect(username = 'wupeiqi' , pkey = private_key )
   
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put( '/tmp/location.py' , '/tmp/test.py' )
# 将remove_path 下载到本地 local_path
sftp.get( 'remove_path' , 'local_path' )
   
transport.close()

​下面是一个上传下载的daemon供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import uuid
 
class SSHConnection( object ):
 
     def __init__( self , host = '172.16.103.191' , port = 22 , username = 'wupeiqi' ,pwd = '123' ):
         self .host = host
         self .port = port
         self .username = username
         self .pwd = pwd
         self .__k = None
 
     def create_file( self ):
         file_name = str (uuid.uuid4())
         with open (file_name, 'w' ) as f:
             f.write( 'sb' )
         return file_name
 
     def run( self ):
         self .connect()
         self .upload( '/home/wupeiqi/tttttttttttt.py' )
         self .rename( '/home/wupeiqi/tttttttttttt.py' , ' / home / wupeiqi / ooooooooo.py)
         self .close()
 
     def connect( self ):
         transport = paramiko.Transport(( self .host, self .port))
         transport.connect(username = self .username,password = self .pwd)
         self .__transport = transport
 
     def close( self ):
 
         self .__transport.close()
 
     def upload( self ,target_path):
         # 连接,上传
         file_name = self .create_file()
 
         sftp = paramiko.SFTPClient.from_transport( self .__transport)
         # 将location.py 上传至服务器 /tmp/test.py
         sftp.put(file_name, target_path)
 
     def rename( self , old_path, new_path):
 
         ssh = paramiko.SSHClient()
         ssh._transport = self .__transport
         # 执行命令
         cmd = "mv %s %s" % (old_path, new_path,)
         stdin, stdout, stderr = ssh.exec_command(cmd)
         # 获取命令结果
         result = stdout.read()
 
     def cmd( self , command):
         ssh = paramiko.SSHClient()
         ssh._transport = self .__transport
         # 执行命令
         stdin, stdout, stderr = ssh.exec_command(command)
         # 获取命令结果
         result = stdout.read()
         return result
         
 
 
ha = SSHConnection()
ha.run()

对于更多限制命令,需要在系统中设置:

1
2
3
4
5
/ etc / sudoers
 
Defaults    requiretty
 
Defaults:cmdb    !requiretty



 

转载于:https://www.cnblogs.com/phennry/p/5716893.html

相关推荐

74hc595驱动模块的Verilog设计(线性状态机)

module hc595_driver( input clk, //50Mhz input rst_n, //复位信号 input [15:0] data, //数码管待显示数据,8位段选数据,8位位选数据 input en, //使能 o...

qq_41294540的博客 3744

Python 进阶(二):Python使用ORM框架peewee操作MySQL数据库

Windows MySQL8.0免安装版,配置多个安装实例Peewee是一个简单而灵活的Python ORM(对象关系映射)框架,它提供了方便的接口和工具,用于在Python应用程序中进行数据库操作。Peewee支持多种数据库后端,包括MySQL、SQLite、PostgreSQL等,使得在不同数据库系统之间进行切换变得更加容易。使用Peewee进行数据库操作,需要定义数据表的模型类。每个模型类对应数据库中的一张表,并定义表中的字段以及其他相关属性。在上述示例中,定义了一个名为User。

后端开发 4915

别再让PyCharm吃光你的C盘!保姆级教程:安全迁移config、plugins和remote sources到D盘

本文提供了一份详细的PyCharm配置与缓存文件迁移指南,帮助开发者将config、plugins和remote sources等占用大量C盘空间的文件安全转移到D盘。通过修改data.properties文件和正确迁移顺序,确保PyCharm功能不受影响,同时释放宝贵的系统盘空间。

weixin_28836989的博客 424

Python 数据持久层ORM框架 SQLAlchemy模块

SQLAlchemy:强大的数据库抽象层,简化ORM操作,提供高效查询接口,支持多种数据库引擎。解锁数据交互潜能,助力开发者专注业务逻辑。选择SQLAlchemy,让数据库管理变得轻松而高效!

weixin_54217348的博客 4282

gtsam 学习十(ISAM2 理论)

翻译自:iSAM2: Incremental Smoothing and Mapping Using the Bayes Tree 摘要 提出了一种新型的贝斯树处理稀疏矩阵,在转化为因子图,可以更好的求解平方根信息和映射问题。 文中提出了三个概念 使用概率密度项进行矩阵分解 介绍如何将矩阵分解转换为贝叶斯数和条件概率密度 基于贝叶斯树提供了一种新的系数非线性优化:ISAM2(进行重新排序和重新线性化,避免了批量更新) 问题描述 文章聚焦与如何用增量实时解决非线性问题, 利用增量即新的测量值实时更新估

weixin_37781153的博客 8409

[ESP32S3N16R8][LVGL8.3.0][IDF5.2.3]ST7701S RGB屏幕驱动[vscode最详细配置]

ST7701S ESP32S3 基于ESP-IDF5.2.3编写,编程环境为vscode。本教程详细讲述了esp32s3配置st7701s屏幕驱动以及gt911触摸驱动并关联到lvgl8.3.0,使用IDF5.23示例rgb_panel进行测试删除了其里面的屏幕驱动,改为单独编写屏幕和触摸驱动,最后完成了实列。

qq_44022379的博客 2608

python-orm框架之SQLALchemy

使用 SQLAlchemy 的 ORM 功能来定义你的数据模型。

wsy_666的博客 1097

Quuppa 如何引领蓝牙 ® 定位服务的全新发展方向

我们最优质的客户,是那些对其他实时定位系统(RTLS)的承诺感到失望、转而寻求 “能覆盖全业务场景的更广泛赋能技术” 的客户 —— 前文提到的消防车制造商就是典型案例:他们尝试并通过 Quuppa 的蓝牙方案取得了成功。我们希望业务合作伙伴(如系统集成商、解决方案提供商)能充分利用 Quuppa 智能定位系统的功能,为客户提供专属解决方案:无论是追踪微型标签、实现未来移动设备的 AoD 功能,还是基于 RSSI 的简单信标(信标作为物联网网关),这些功能都能让同一套 Quuppa 系统支持广泛的用例。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 833

python orm框架sqlalchemy_Python之ORM框架SQLAlchemy

一、SQLAlchemy简介SQLAlchemy是Python SQL工具包和对象关系映射器,是python中最著名的ORM(Object Relationship Mapping)框架,它简化了应用程序开发人员在原生SQL上的操作,使开发人员将主要精力都放在程序逻辑上,从而提高开发效率。它提供了一整套著名的企业级持久性模式,设计用于高效和高性能的数据库访问。使用ORM操作数据库:优势 :代码易读...

weixin_39731623的博客 225

【ArcPy】用Python批量处理大规模地理数据的几何校正

在许多GIS应用中,尤其是在大规模地理数据处理时,几何校正(Geometric Correction)是一个至关重要的任务。它确保了不同来源的地理数据能够正确地对齐和匹配,从而为后续分析提供准确的基础。几何校正的常见应用包括遥感影像的地理配准、矢量数据的投影转换等。几何校正通常包括坐标转换、重采样等步骤。以下示例展示了如何使用arcpy的工具进行几何校正。"""实施几何校正:param input_layer: 输入待校正数据层。

陈书予 1002

大数据运营可视化:Tableau+PowerBI数据看板搭建教程

当企业数据量从“GB级”跃升到“TB级”,运营人员面临的最大挑战不再是“如何收集数据”,而是“如何让数据说话”。数据看板作为“运营指挥中心的仪表盘”,能将零散的用户行为、业务指标、流量趋势浓缩成可快速解读的视觉语言。本文结合Tableau(自由探索的“数据瑞士军刀”)与PowerBI(微软生态的“组合家具”)两大工具,从需求分析→数据准备→指标设计→视图搭建→ dashboard 组合,一步步教你搭建符合业务逻辑的运营看板。

AI智能探索者的博客 1367

深入解析Python ORM框架SQLAlchemy

SQLAlchemy架构与核心机制解析 SQLAlchemy作为Python生态中成熟的ORM框架,采用分层架构设计,包含ORM层、Core层和引擎层。其核心机制包括:Engine与连接池、Dialect方言系统、分层架构、关键特性等。

专注人工智能应用领域 1040

基于 Qt C++ 的金融行情交易终端

由于完整的商业级源码非常庞大,我将为你提供一个 **结构完整、可直接编译运行的基础框架**,并详细说明各模块的实现思路和扩展方向。double波动 = quote.lastPrice * (rand()%200 - 100) / 10000.0;// 订单缓存(orderId -> Order)

寒寒豆豆软件公司的博客 191

python中orm框架sqlalchemy使用

python中orm框架sqlalchemy使用 文章目录python中orm框架sqlalchemy使用一、简介二、准备2.1 官网地址2.2 依赖包安装三、使用3.1 创建映射对象3.2 创建数据库连接3.3 查询3.3.1 常用查询3.3.2 条件查询3.3.3 直接sql语句查询3.4 插入3.4.1 单条插入3.4.2 批量插入3.4.3 使用sql语句插入3.4.4 忽略已存在的插入3...

panda-star的博客 1232

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python orm 框架中sqlalchemy用法

一.ORM简介 1. ORM(Object-Relational Mapping,对象关系映射):作用是在关系型数据库和业务实体对象之间做一个映射. 2. ORM优点: 向开发者屏蔽了数据库的细节,使开发者无需与SQL语句打交道,提高了开发效率; 便于数据库的迁移,由于每种数据库的SQL语法有差别,基于Sql的数据访问层在更换数据库时通过需要花费时间调试SQL时间,而ORM提供了独立于SQL的接口...

Dawn__Z的博客 556

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python orm框架sqlalchemy_Python 中使用 SQLAlchemy 作为 ORM框架

SQLAlchemy 是Python中最有名的ORM框架。安装SQLAlchemy:$ pip install sqlalchemy导入SQLAlchemy,并初始化DBSession:from sqlalchemy import Column, String, create_enginefrom sqlalchemy.orm import sessionmakerfrom sqlalchemy....

weixin_39890332的博客 123

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python orm框架sqlalchemy_python orm 框架中sqlalchemy用法实例详解

本文实例讲述了python orm 框架中sqlalchemy用法。分享给大家供大家参考,具体如下:一.ORM简介1. ORM(Object-Relational Mapping,对象关系映射):作用是在关系型数据库和业务实体对象之间做一个映射.2. ORM优点:向开发者屏蔽了数据库的细节,使开发者无需与SQL语句打交道,提高了开发效率;便于数据库的迁移,由于每种数据库的SQL语法有差别,基于Sq...

weixin_39667080的博客 230

python常用库之数据库orm框架之SQLAlchemy

SQLAlchemy是一个基于Python实现的SQL工具包和ORM框架,提供了高层抽象来管理数据库交互。

西京刀客 2万+

Python SQLAlchemy ORM 框架的深入解析

SQLAlchemy ORM 是一个功能强大的工具,能够显著提高开发效率并降低数据库操作的复杂度。通过本文的学习,你应该已经掌握了如何使用 SQLAlchemy ORM 来构建和管理数据库模型。希望你能结合实际项目需求,进一步探索和应用这些知识。```

2501_91137201的博客 443

python ORM框架sqlalchemy使用详解

from sqlalchemy import create_engine #创建引擎 engine = create_engine( "postgresql://postgres:postgres@192.168.91.13:5432/legaldata", max_overflow=2, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 ...

panyanzhe126的博客 566

Python ORM框架之SQLAlchemy

前言: Django的ORM虽然强大,但是毕竟局限在Django,而SQLAlchemy是Python中的ORM框架; SQLAlchemy的作用是:类/对象--->SQL语句--->通过pymysql/MySQLdb模块--->提交到数据库执行; 组成部分: Engine,框架的引擎 Connection Pooling ,数据库连接池...

weixin_30402085的博客 244

python数据库框架orm_Python ORM框架之SQLAlchemy

前言:Django的ORM虽然强大,但是毕竟局限在Django,而SQLAlchemy是Python中的ORM框架;SQLAlchemy的作用是:类/对象--->SQL语句--->通过pymysql/MySQLdb模块--->提交到数据库执行;组成部分:Engine,框架的引擎Connection Pooling ,数据库连接池Dialect,选择连接数据库的DB API种类Sc...

weixin_39611308的博客 435

SQLAlchemy——python ORM框架

SQLAlchemy——python ORM框架一、创建数据表二、增删改查操作2.1 增加数据2.2 查询数据2.3 修改数据2.4 删除数据2.5 高级版查询2.6 高级修改数据操作三、表关系:一对多的操作3.1 创建数据表及关系relationship3.2 基于relationship增加数据3.3 基于relationship查询数据3.4 更新数据3.5 删除数据四、表关系:多对多操作4...

筑梦人 440

Python ORM 框架 SQLAlchemy 的简单使用

本篇博文主要列举了ORM框架SQLAlchemy的增删改查API接口的使用,第四章节主要是封装了简单的增删改查的工具类,减少实体类与查询条件的耦合性

lujx_1024的博客 1678
上一篇: Mysql数据库基本操作
下一篇: SQLAlchmy模块详解
die8252
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值