本教程只讲述sqlalchemy的ORM使用方式,手写sql的使用基本上和python-mysqldb没区别。
使用环境:部署了openstack的虚拟机。否则请自行安装sqlalchemy所需的各种包。
以下开始使用sqlalchemy来读取我们的nova数据库里面的数据。
fromsqlalchemy import *
fromsqlalchemy.orm import sessionmaker
DB_CONNECT_STRING
='mysql://root:dfe16cf8429dbb9dd2e4@localhost/nova?charset=utf8'
engine= create_engine(DB_CONNECT_STRING, echo=False)
DB_Session= sessionmaker(bind=engine)
session= DB_Session()
这里的DB_CONNECT_STRING就是连接数据库的路径,从nova.conf里面取得。“mysql”指定了连接方式,“root”和“dfe16cf8429dbb9dd2e4”分别是用户名和密码,“localhost”是数据库的域名,“ooxx”是使用的数据库名(可省略),“charset”指定了连接时使用的字符集(可省略)。
create_engine()会返回一个数据库引擎,echo参数为True时,会显示每条执行的SQL语句,生产环境下可关闭。
sessionmaker()会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行SQL语句。
定义一个表:
使用nova数据库的service表:
fromsqlalchemy import Column
fromsqlalchemy.types import CHAR, Integer, String
fromsqlalchemy.ext.declarative import declarative_base
BaseModel= declarative_base()
definit_db():
BaseModel.metadata.create_all(engine)
defdrop_db():
BaseModel.metadata.drop_all(engine)
classService(BaseModel):
"""Representsa running service on a host."""
__tablename__= 'services'
id= Column(Integer, primary_key=True)
host= Column(String(255)) # , ForeignKey('hosts.id'))
host_ip= Column(String(255))
binary= Column(String(255))
topic= Column(String(255))
report_count= Column(Integer, nullable=False, default=0)
disabled= Column(Boolean, default=False)
availability_zone= Column(String(255), default='nova')
init_db()
declarative_base()创建了一个BaseModel类,这个类的子类可以自动与一个表关联。
接着就开始使用这个表吧:
fromsqlalchemy import func, or_, not_
service= Service(host='xww',host_ip='22.22.22.22')
session.add(service)
session.commit()
query= session.query(Service)
#printquery
forserveice in query:
printservice.host, service.host_ip
可以看到输出的结果就是我们想要的。如果service表之前有内容,也会一并输出。