python mssql bulk_python - 使用SQLAlchemy ORM批量插入

ORM基本上不适用于高性能散装刀片 -    这就是SQLAlchemy除了提供Core之外还提供Core的全部原因   ORM作为一流的组件。

对于快速批量插入的用例,SQL生成和   ORM构建在其上的执行系统是Core的一部分。   直接使用这个系统,我们可以生成一个INSERT   与直接使用原始数据库API竞争。

或者,SQLAlchemy ORM提供批量操作套件   方法,它为工作单元的子部分提供钩子   进程以发出核心级INSERT和UPDATE结构   一小部分基于ORM的自动化。

下面的例子说明了几种不同的基于时间的测试   插入行的方法,从最自动化到最小化。   使用cPython 2.7,观察到运行时:

import time

import sqlite3

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, create_engine

from sqlalchemy.orm import scoped_session, sessionmaker

Base = declarative_base()

DBSession = scoped_session(sessionmaker())

engine = None

class Customer(Base):

__tablename__ = "customer"

id = Column(Integer, primary_key=True)

name = Column(String(255))

def init_sqlalchemy(dbname='sqlite:///sqlalchemy.db'):

global engine

engine = create_engine(dbname, echo=False)

DBSession.remove()

DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False)

Base.metadata.drop_all(engine)

Base.metadata.create_all(engine)

def test_sqlalchemy_orm(n=100000):

init_sqlalchemy()

t0 = time.time()

for i in xrange(n):

customer = Customer()

customer.name = 'NAME ' + str(i)

DBSession.add(customer)

if i % 1000 == 0:

DBSession.flush()

DBSession.commit()

print(

"SQLAlchemy ORM: Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def test_sqlalchemy_orm_pk_given(n=100000):

init_sqlalchemy()

t0 = time.time()

for i in xrange(n):

customer = Customer(id=i+1, name="NAME " + str(i))

DBSession.add(customer)

if i % 1000 == 0:

DBSession.flush()

DBSession.commit()

print(

"SQLAlchemy ORM pk given: Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def test_sqlalchemy_orm_bulk_insert(n=100000):

init_sqlalchemy()

t0 = time.time()

n1 = n

while n1 > 0:

n1 = n1 - 10000

DBSession.bulk_insert_mappings(

Customer,

[

dict(name="NAME " + str(i))

for i in xrange(min(10000, n1))

]

)

DBSession.commit()

print(

"SQLAlchemy ORM bulk_save_objects(): Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def test_sqlalchemy_core(n=100000):

init_sqlalchemy()

t0 = time.time()

engine.execute(

Customer.__table__.insert(),

[{"name": 'NAME ' + str(i)} for i in xrange(n)]

)

print(

"SQLAlchemy Core: Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def init_sqlite3(dbname):

conn = sqlite3.connect(dbname)

c = conn.cursor()

c.execute("DROP TABLE IF EXISTS customer")

c.execute(

"CREATE TABLE customer (id INTEGER NOT NULL, "

"name VARCHAR(255), PRIMARY KEY(id))")

conn.commit()

return conn

def test_sqlite3(n=100000, dbname='sqlite3.db'):

conn = init_sqlite3(dbname)

c = conn.cursor()

t0 = time.time()

for i in xrange(n):

row = ('NAME ' + str(i),)

c.execute("INSERT INTO customer (name) VALUES (?)", row)

conn.commit()

print(

"sqlite3: Total time for " + str(n) +

" records " + str(time.time() - t0) + " sec")

if __name__ == '__main__':

test_sqlalchemy_orm(100000)

test_sqlalchemy_orm_pk_given(100000)

test_sqlalchemy_orm_bulk_insert(100000)

test_sqlalchemy_core(100000)

test_sqlite3(100000)

脚本:

import time

import sqlite3

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import Column, Integer, String, create_engine

from sqlalchemy.orm import scoped_session, sessionmaker

Base = declarative_base()

DBSession = scoped_session(sessionmaker())

engine = None

class Customer(Base):

__tablename__ = "customer"

id = Column(Integer, primary_key=True)

name = Column(String(255))

def init_sqlalchemy(dbname='sqlite:///sqlalchemy.db'):

global engine

engine = create_engine(dbname, echo=False)

DBSession.remove()

DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False)

Base.metadata.drop_all(engine)

Base.metadata.create_all(engine)

def test_sqlalchemy_orm(n=100000):

init_sqlalchemy()

t0 = time.time()

for i in xrange(n):

customer = Customer()

customer.name = 'NAME ' + str(i)

DBSession.add(customer)

if i % 1000 == 0:

DBSession.flush()

DBSession.commit()

print(

"SQLAlchemy ORM: Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def test_sqlalchemy_orm_pk_given(n=100000):

init_sqlalchemy()

t0 = time.time()

for i in xrange(n):

customer = Customer(id=i+1, name="NAME " + str(i))

DBSession.add(customer)

if i % 1000 == 0:

DBSession.flush()

DBSession.commit()

print(

"SQLAlchemy ORM pk given: Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def test_sqlalchemy_orm_bulk_insert(n=100000):

init_sqlalchemy()

t0 = time.time()

n1 = n

while n1 > 0:

n1 = n1 - 10000

DBSession.bulk_insert_mappings(

Customer,

[

dict(name="NAME " + str(i))

for i in xrange(min(10000, n1))

]

)

DBSession.commit()

print(

"SQLAlchemy ORM bulk_save_objects(): Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def test_sqlalchemy_core(n=100000):

init_sqlalchemy()

t0 = time.time()

engine.execute(

Customer.__table__.insert(),

[{"name": 'NAME ' + str(i)} for i in xrange(n)]

)

print(

"SQLAlchemy Core: Total time for " + str(n) +

" records " + str(time.time() - t0) + " secs")

def init_sqlite3(dbname):

conn = sqlite3.connect(dbname)

c = conn.cursor()

c.execute("DROP TABLE IF EXISTS customer")

c.execute(

"CREATE TABLE customer (id INTEGER NOT NULL, "

"name VARCHAR(255), PRIMARY KEY(id))")

conn.commit()

return conn

def test_sqlite3(n=100000, dbname='sqlite3.db'):

conn = init_sqlite3(dbname)

c = conn.cursor()

t0 = time.time()

for i in xrange(n):

row = ('NAME ' + str(i),)

c.execute("INSERT INTO customer (name) VALUES (?)", row)

conn.commit()

print(

"sqlite3: Total time for " + str(n) +

" records " + str(time.time() - t0) + " sec")

if __name__ == '__main__':

test_sqlalchemy_orm(100000)

test_sqlalchemy_orm_pk_given(100000)

test_sqlalchemy_orm_bulk_insert(100000)

test_sqlalchemy_core(100000)

test_sqlite3(100000)

你可能感兴趣的:(python,mssql,bulk)