赞
踩
一个熟练使用过SQLAlchemy的程序员,执行同一个SQL指令应该尝试过以下三种方式:
连接到数据库,获取对象
- engine = create_engine("parameter)
- connection=engine.connection()
- session_bind=sessionmaker(bind=engine)
- session=session_bind()
Engine处理
- #Engine:
-
- engine.execute(select([table])).fetchall()
-
connection处理
- #connection
- connection.execute(select([table])).fetchall()
-
session处理
- #session
- session.execute(select([table])).fetchall()
虽然使用的方式不同,但是产生的结果都是同样的;为什么呢?
要搞懂这个,就需要知道Executable类,Executable是所有select(),delete(),update(),insert(),text()等对象的超类,它可以支持所有的SQL表达式;在数据库层面来看,使用它们三个就是同一回事儿;详情可以搜索Executable类
1,Engine是SQLAlchemy中连接数据库最底层级别的对象,它维护了一个连接池,可以在应用程序需要和数据库对话时使用。在Engine.execute(close_with_result=True) close_with_result=True 表示连接自动关闭;
官方文档用法:点击此处
例如代码:
- result = engine.execute('SELECT * FROM tablename;')
-
-
- conn = engine.connect(close_with_result=True)
- result = conn.execute('SELECT * FROM tablename;')
-
-
- for row in result:
- print(result['columnname']
-
-
- result.close()
2,Connection,实际上是执行SQL查询的工作,每当你想更好的控制连接的属性,如何时关闭等都建议使用这个操作;比如在一个事务中,要控制它提交commit的时间,在connection控制中就可以运行多个不同的SQL语句,如果其中一个出现问题,则其他所有的语句都会撤销更改;
例如代码:
- connection = engine.connect()
- trans = connection.begin()
- try:
- connection.execute("INSERT INTO films VALUES ('Comedy', '82 minutes');")
- connection.execute("INSERT INTO datalog VALUES ('added a comedy');")
- trans.commit()
- except:
- trans.rollback()
- raise
3,Session,一般都是用于ORM中,因为在ORM中,会自动生成SQL语句以及自动连接数据库(自己配置),使用session.execute()也是个编辑的方法,可以将会话绑定到任何对象;如果你确定使用ORM,就建议使用session来处理execute(),否则还是使用connection更好方便;
从应用角度来看,可以把这三类分为两种:
1,直接使用Engine.execute( ) 或Connection.execute( ),更加灵活,可以使用原生SQL语句;
2,使用Session处理交易类型的数据,因为方便使用session.add(),session.rollback(),session.commit(),session.close()等,它是使用ORM时推荐的一种和数据库交互的方式;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。