sqlalchemy 连接池怎么与sqlite3连接

使用SQLAlchemy - 廖雪峰的官方网站
使用SQLAlchemy
数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表:
('1', 'Michael'),
('2', 'Bob'),
('3', 'Adam')
Python的DB-API返回的数据结构就是像上面这样表示的。
但是用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:
class User(object):
def __init__(self, id, name):
self.id = id
self.name = name
User('1', 'Michael'),
User('2', 'Bob'),
User('3', 'Adam')
这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?
但是由谁来做这个转换呢?所以ORM框架应运而生。
在Python中,最有名的ORM框架是SQLAlchemy。我们来看看SQLAlchemy的用法。
首先通过easy_install或者pip安装SQLAlchemy:
$ easy_install sqlalchemy
然后,利用上次我们在MySQL的test数据库中创建的user表,用SQLAlchemy来试试:
第一步,导入SQLAlchemy,并初始化DBSession:
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# 创建对象的基类:
Base = declarative_base()
# 定义User对象:
class User(Base):
# 表的名字:
__tablename__ = 'user'
# 表的结构:
id = Column(String(20), primary_key=True)
name = Column(String(20))
# 初始化数据库连接:
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
以上代码完成SQLAlchemy的初始化和具体每个表的class定义。如果有多个表,就继续定义其他class,例如School:
class School(Base):
__tablename__ = 'school'
name = ...
create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:
'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
你只需要根据需要替换掉用户名、口令等信息即可。
下面,我们看看如何向数据库表中添加一行记录。
由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:
# 创建session对象:
session = DBSession()
# 创建新User对象:
new_user = User(id='5', name='Bob')
# 添加到session:
session.add(new_user)
# 提交即保存到数据库:
# 关闭session:
session.close()
可见,关键是获取session,然后把对象添加到session,最后提交并关闭。Session对象可视为当前数据库连接。
如何从数据库表中查询数据呢?有了ORM,查询出来的可以不再是tuple,而是User对象。SQLAlchemy提供的查询接口如下:
# 创建Session:
session = DBSession()
# 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
user = session.query(User).filter(User.id=='5').one()
# 打印类型和对象的name属性:
print 'type:', type(user)
print 'name:', user.name
# 关闭Session:
session.close()
运行结果如下:
type: &class '__main__.User'&
可见,ORM就是把数据库表的行与相应的对象建立关联,互相转换。
由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。
例如,如果一个User拥有多个Book,就可以定义一对多关系如下:
class User(Base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
books = relationship('Book')
class Book(Base):
__tablename__ = 'book'
id = Column(String(20), primary_key=True)
name = Column(String(20))
# “多”的一方的book表是通过外键关联到user表的:
user_id = Column(String(20), ForeignKey('user.id'))
当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list。
ORM框架的作用就是把数据库表的一行记录与一个对象互相做自动转换。
正确使用ORM的前提是了解关系数据库的原理。
Make a Comment
Sign In to Make a Comment
You can sign in directly without register:
You need authorize to allow connect to your social passport for the first time.
WARNING: You are using an old browser that does not support HTML5.
Please choose a modern browser ( /
/ ) to get a good experience.沈猪猪 的BLOG
用户名:沈猪猪
文章数:146
评论数:33
访问量:40675
注册日期:
阅读量:5863
阅读量:12276
阅读量:375505
阅读量:1068814
51CTO推荐博文
ORM简介ORM全称是Object Relational Mapping(关系对象映射)。实质是将关系数据库中的业务数据用对象的形式表示出来,并通过面向对象的方式将这些对象组织起来,最终在应用中创建一个虚拟对象数据库。核心就是一个class对应一张表。SQLAlchemy现在已经是python中最流行的ORM框架。ORM优点:1、隐藏数据库实现,让业务代码只访问对象而不是数据库表2、良好的数据库操作接口,简单、学习成本低3、动态数据表映射,表结构改变时,减少代码修改量4、方便引入缓存功能SQLAlchemy结构SQLAlchemy ORM详解yum&install&-y&python-sqlalchemy&#&或pip&install&sqlalchemy
yum&install&-y&python-libs&&#&安装sqlite3
pip&install&sqlalchemy-utils&#&安装sqlalchemy&一些工具类sqlite数据库操作:
创建数据库及表结构[root@controller001 home]# cat sqlalchemy_tur.pyimport sqlalchemyfrom sqlalchemy import create_engine # operate databasefrom sqlalchemy.ext.declarative import declarative_base # create database table base classfrom sqlalchemy import Column, Integer, String # table structure typefrom sqlalchemy.orm import sessionmaker # Use Database Transaction# sqlite database is mostly used for android system.# echo=True optios: print the real sql,mostly used in debug.engine = create_engine('sqlite:///foo.db', echo=True) & # 创建数据库的引擎# 如果是mysql engine,就要先创建database[root@controller001 home]# cat sqlalchemy_tur_3.pyimport sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy_utils import database_exists, create_database # 需要安装sqlalchemy_utilsengine = create_engine('mysql://root:dbroot@localhost/sqlalchemy')if not database_exists(engine.url): create_database(engine.url)print(database_exists(engine.url))# 不同数据库的engine配置:&Base = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)fullname = Column(String)password = Column(String)def __repr__(self):return "&User(name='%s', fullname='%s', password='%s')&" %(self.name, self.fullname, self.password)Base.metadata.create_all(engine)执行后,会在本地生成一个foo.db sqlite数据库插入数据user_1 = User(name='user1', fullname='Yao', password='user1')Session = sessionmaker(bind=engine) & &# 使用数据库事务,保持数据原子性session = Session()session.add(user_1)mit()#&执行结果
[root@controller001&home]#&python&sqlalchemy_tur.py
&20:59:16,178&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&plain&returns'&AS&VARCHAR(60))&AS&anon_1
&20:59:16,179&INFO&sqlalchemy.engine.base.Engine&()
&20:59:16,179&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&unicode&returns'&AS&VARCHAR(60))&AS&anon_1
&20:59:16,179&INFO&sqlalchemy.engine.base.Engine&()
&20:59:16,181&INFO&sqlalchemy.engine.base.Engine&BEGIN&(implicit)
&20:59:16,182&INFO&sqlalchemy.engine.base.Engine&INSERT&INTO&users&(name,&fullname,&password)&VALUES&(?,&?,&?)
&20:59:16,182&INFO&sqlalchemy.engine.base.Engine&('user1',&'Yao',&'user1')
&20:59:16,184&INFO&sqlalchemy.engine.base.Engine&SELECT&users.id&AS&users_id,&users.name&AS&users_name,&users.fullname&AS&users_fullname,&users.password&AS&users_password
FROM&users
WHERE&users.name&=&?
&LIMIT&?&OFFSET&?
&20:59:16,185&INFO&sqlalchemy.engine.base.Engine&('user1',&1,&0)
&20:59:16,186&INFO&sqlalchemy.engine.base.Engine&COMMIT
[root@controller001&home]#&sqlite3&foo.db
SQLite&version&3.7.17&&00:56:22
Enter&".help"&for&instructions
Enter&SQL&statements&terminated&with&a&";"
sqlite&&select&*&from&
1|user1|Yao|user1插入多条数据Session = sessionmaker(bind=engine)session = Session()session.add_all([User(name='user1', fullname='user1_1', password='123'),User(name='user2', fullname='user2_2', password='123'),User(name='user3', fullname='user3_3', password='123')])mit()#&执行结果
root@controller001&home]#&python&sqlalchemy_tur.py
&21:08:25,372&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&plain&returns'&AS&VARCHAR(60))&AS&anon_1
&21:08:25,372&INFO&sqlalchemy.engine.base.Engine&()
&21:08:25,373&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&unicode&returns'&AS&VARCHAR(60))&AS&anon_1
&21:08:25,373&INFO&sqlalchemy.engine.base.Engine&()
&21:08:25,374&INFO&sqlalchemy.engine.base.Engine&BEGIN&(implicit)
&21:08:25,376&INFO&sqlalchemy.engine.base.Engine&INSERT&INTO&users&(name,&fullname,&password)&VALUES&(?,&?,&?)
&21:08:25,376&INFO&sqlalchemy.engine.base.Engine&('user1',&'user1_1',&'123')
&21:08:25,377&INFO&sqlalchemy.engine.base.Engine&INSERT&INTO&users&(name,&fullname,&password)&VALUES&(?,&?,&?)
&21:08:25,377&INFO&sqlalchemy.engine.base.Engine&('user2',&'user2_2',&'123')
&21:08:25,377&INFO&sqlalchemy.engine.base.Engine&INSERT&INTO&users&(name,&fullname,&password)&VALUES&(?,&?,&?)
&21:08:25,378&INFO&sqlalchemy.engine.base.Engine&('user3',&'user3_3',&'123')
&21:08:25,380&INFO&sqlalchemy.engine.base.Engine&SELECT&users.id&AS&users_id,&users.name&AS&users_name,&users.fullname&AS&users_fullname,&users.password&AS&users_password
FROM&users
WHERE&users.name&=&?
&LIMIT&?&OFFSET&?
&21:08:25,380&INFO&sqlalchemy.engine.base.Engine&('user1',&1,&0)
&21:08:25,381&INFO&sqlalchemy.engine.base.Engine&COMMIT
[root@controller001&home]#&sqlite3&foo.db
SQLite&version&3.7.17&&00:56:22
Enter&".help"&for&instructions
Enter&SQL&statements&terminated&with&a&";"
sqlite&&select&*&from&
1|user1|Yao|user1
2|user1|user1_1|123
3|user2|user2_2|123
4|user3|user3_3|123查询res = session.query(User).filter_by(name='user1').first()res = session.query(User).all() # 全表扫描for row in session.query(User).order_by(User.id): # id排序& & & print rowfor row in session.query(User).filter(User.name.in_(['yao','shen','tim'])): &# in操作&&&& &print row&for row in session.query(User).filter(~User.name.in_(['yao','shen','tim'])):&# not in 操作& & & print rowsession.query(User).filter(User.name == 'yao').count() &# 计数操作from sqlalchemy import and_, or_for row in&session.query(User).filter(and_(User.name == 'yao', User.fullname=='yao')): # 与操作& & &print rowfor row in&session.query(User).filter(or_(User.name == 'yao', User.fullname=='yao')): # 或操作& & &print row创建一个带有外键的表[root@controller001 home]# cat sqlalchemy_tur.pyimport sqlalchemyfrom sqlalchemy import create_engine # operate databasefrom sqlalchemy.ext.declarative import declarative_base # create database table base classfrom sqlalchemy import Column, Integer, String # table structure typefrom sqlalchemy.orm import sessionmaker # Use Database Transaction# sqlite database is mostly used for android system.# echo=True optios: print the real sql,mostly used in debug.engine = create_engine('sqlite:///foo.db', echo=True)Base = declarative_base()class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)fullname = Column(String)password = Column(String)def __repr__(self):return "&User(name='%s', fullname='%s', password='%s')&" %(self.name, self.fullname, self.password)from sqlalchemy import ForeignKeyfrom sqlalchemy.orm import relationship, backrefclass Address(Base):__tablename__ = 'address'id = Column(Integer, primary_key=True)email_address = Column(String, nullable=False)user_id = Column(Integer, ForeignKey('users.id'))user = relationship("User", backref=backref('address', order_by=id))def __repr__(self):return "&Address(email_address='%s')" % self.email_addressBase.metadata.create_all(engine)#&执行结果
[root@controller001&home]#&python&sqlalchemy_tur.py
&21:31:37,289&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&plain&returns'&AS&VARCHAR(60))&AS&anon_1
&21:31:37,289&INFO&sqlalchemy.engine.base.Engine&()
&21:31:37,290&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&unicode&returns'&AS&VARCHAR(60))&AS&anon_1
&21:31:37,290&INFO&sqlalchemy.engine.base.Engine&()
&21:31:37,291&INFO&sqlalchemy.engine.base.Engine&PRAGMA&table_info("users")
&21:31:37,292&INFO&sqlalchemy.engine.base.Engine&()
&21:31:37,292&INFO&sqlalchemy.engine.base.Engine&PRAGMA&table_info("address")
&21:31:37,293&INFO&sqlalchemy.engine.base.Engine&()
&21:31:37,293&INFO&sqlalchemy.engine.base.Engine
CREATE&TABLE&address&(
id&INTEGER&NOT&NULL,
email_address&VARCHAR&NOT&NULL,
user_id&INTEGER,
PRIMARY&KEY&(id),
FOREIGN&KEY(user_id)&REFERENCES&users&(id)
&21:31:37,293&INFO&sqlalchemy.engine.base.Engine&()
&21:31:37,343&INFO&sqlalchemy.engine.base.Engine&COMMIT插入数据ice = User(name='ice', fullname='ice yao', password='ice')ice.addresses = [& & & & Address(email_address=''),& & & & Address(email_address='')& & & & & & & & ]session.add(ice)mit()for u, a in session.query(User, Address).\& & & & & & filter(User.id==Address.user_id).\& & & & & & filter(Address.email_address=='').\& & & & & & all():& & & & print u, aSQLAlchemy Core详解创建数据库及表[root@controller001 home]# cat sqlalchemy_tur_2.pyimport sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKeyengine = create_engine('sqlite:///foo.db', echo=True)metadata = MetaData()users = Table('users', metadata, & & & & # 这里使用Table来创建表Column('id', Integer, primary_key=True),Column('name', String),Column('fullname', String))address = Table('address', metadata,Column('id', Integer, primary_key=True),Column('user_id', None, ForeignKey('users.id')),Column('email_address', String, nullable=False))metadata.create_all(engine)查看sqlite数据库sqlite& .schemaCREATE TABLE users (id INTEGER NOT NULL,name VARCHAR,fullname VARCHAR,PRIMARY KEY (id));CREATE TABLE address (id INTEGER NOT NULL,user_id INTEGER,email_address VARCHAR NOT NULL,PRIMARY KEY (id),FOREIGN KEY(user_id) REFERENCES users (id));插入数据conn&=&engine.connect()&&&#&初始化一个连接
conn.execute(users.insert(),&[dict(name='jack',&fullname='jack&jons'),
dict(name='wendy',&fullname='wendy&ice')])查询from sqlalchemy.sql import selects = select([users]) & &# 语法很像sqlres = conn.execute(s)for row in res:print row#&执行结果
[root@controller001&home]#&python&sqlalchemy_tur_2.py
&22:24:14,459&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&plain&returns'&AS&VARCHAR(60))&AS&anon_1
&22:24:14,460&INFO&sqlalchemy.engine.base.Engine&()
&22:24:14,460&INFO&sqlalchemy.engine.base.Engine&SELECT&CAST('test&unicode&returns'&AS&VARCHAR(60))&AS&anon_1
&22:24:14,460&INFO&sqlalchemy.engine.base.Engine&()
&22:24:14,462&INFO&sqlalchemy.engine.base.Engine&SELECT&users.id,&users.name,&users.fullname
FROM&users
&22:24:14,462&INFO&sqlalchemy.engine.base.Engine&()
(1,&u'jack',&u'jack&jons')
(2,&u'wendy',&u'wendy&ice')# 带where的条件查询from sqlalchemy.sql import selects = select([users, address]).where(users.c.id == address.c.user_id)res = conn.execute(s)for row in res:& & & & print row# 使用text,更像sql了from sqlalchemy.sql import selects = text(& & & & "SELECT users.fullname || ',' || address.email_address AS title "& & & & & & & & "FROM users, address "& & & & & & & & "WHERE users.id = address.user_id "& & & & & & & & "AND users.name BETWEEN :x AND :y "& & & & & & & & "AND (address.email_address LIKE :t1 "& & & & & & & & "OR address.email_address LIKE :t2)")res = conn.execute(s, x='m',y='z',t1='@',t2='@').fetchall()for row in res:& & & & print row本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)SQLAlchemy指南_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
SQLAlchemy指南
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩16页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2014年8月 其他开发语言大版内专家分月排行榜第二2014年7月 其他开发语言大版内专家分月排行榜第二2014年5月 其他开发语言大版内专家分月排行榜第二2014年4月 其他开发语言大版内专家分月排行榜第二2014年3月 其他开发语言大版内专家分月排行榜第二2014年1月 其他开发语言大版内专家分月排行榜第二2013年12月 其他开发语言大版内专家分月排行榜第二2013年11月 其他开发语言大版内专家分月排行榜第二2013年3月 其他开发语言大版内专家分月排行榜第二2012年5月 其他开发语言大版内专家分月排行榜第二2012年4月 其他开发语言大版内专家分月排行榜第二2010年10月 其他开发语言大版内专家分月排行榜第二2010年9月 其他开发语言大版内专家分月排行榜第二
2013年9月 其他开发语言大版内专家分月排行榜第三2012年6月 其他开发语言大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 sqlalchemy 关闭连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信