sqlalchemy

时间:2024-06-12 01:24:22编辑:花茶君

sqlalchemy 里的 session 具体有什么作用

官网有写,不过看的不是很懂。
大致意思是Session用于创建程序与数据库之间的会话,并将这个会话以python的面向对象方式(“holding zone”)进行包装,提供给python其他程序调用。
Session提供一个进行数据库查询(query)的入口,python程序通过Session实例,可以对正在连接的数据库进行查询(查询结果是一个面向对象实例),将修改的内容(一般是修改面向对象实例,然后通过Session将修改的实例与数据库中特定数据“同步”。)
Session中有一个很重要的理念“Identity Map”。Session查询的结果实例,我们修改过的实例,和数据库中的数据是怎么关联起来的呢?就是靠“Identity Map”,每个实例都具有“Identity Map”记录,每个“Identity Map”都和数据行的主键(primary key)一一对应。

(这是我的渣英语翻译+个人理解写的。有不对的地方,欢迎大神指点)

官网内容:
In the most general sense, the Session establishes all conversations with the database and represents a “holding zone” for all the objects which you’ve loaded or associated with it during its lifespan. It provides the entrypoint to acquire a Query object, which sends queries to the database using the Session object’s current database connection, populating result rows into objects that are then stored in the Session, inside a structure called the Identity Map - a data structure that maintains unique copies of each object, where “unique” means “only one object with a particular primary key”.

官网资料:http://docs.sqlalchemy.org/en/rel_0_9/orm/session_basics.html#what-does-the-session-do


sqlalchemy做批量数据插入的时候要注意什么?有什么可以优化的

举例来说吧. 关键点都在注释里import sqlalchemy as sa# 用Sqlite做例子,别的数据库连接字符串不同engine = sa.create_engine('sqlite://', echo=True)metadata = sa.MetaData()# 假定这个是表结构widgets_table = sa.Table('widgets', metadata, sa.Column('id', sa.Integer, primary_key=True), sa.Column('foo', sa.String(50)), sa.Column('bar', sa.String(50)), sa.Column('biz', sa.Boolean), sa.Column('baz', sa.Integer), )metadata.create_all(engine)# 假定这是你的数据结构,在一个list中每个元组是一条记录values = [ (None, "Test", True, 3), (None, "Test", True, 3), ]# 主要是参考这部分如何批量插入with engine.connect() as connection: with connection.begin() as transaction: try: markers = ','.join('?' * len(values[0])) # 按段数拼成makers = '(?,?,?,?)' ins = 'INSERT INTO {tablename} VALUES ({markers})' ins = ins.format(tablename=widgets_table.name, markers=markers) # 如果你的表已经存在了,widgets_table.name改成表名就行了. connection.execute(ins, values) except: transaction.rollback() raise else: transaction.commit()


我觉得 flask-sqlalchemy 的实现是不是有其局限性

flask-sqlalchemy把它的执行上下文绑定在了flask的app的context上。
但sqlalchemy本身提供了scoped_session.
如果把一个线程看成一个目录,那么其下有app.context栈和sqlalchemy.scoped_session2个资源。
现在他的实现,把sqlalchemy.scoped_session的资源放在了app.context栈下。
如果需要自己起个worker线程来处理redis的消息并写入数据库,那么flask-sqlalchemy的db对象就没有办法在自己的线程里执行了。
app.xn--teardown_appcontext,session-8x78c.xn--remove()ok-3m3p752k.">相反如果把db的实现和app的context脱离开来,就灵活多了。反正只要注册一下@app.teardown_appcontext,把session.remove()就ok了。


上一篇:卢克-沃顿

下一篇:萧山教师进修学校