File: large_flush.py

package info (click to toggle)
sqlalchemy 0.6.3-3%2Bsqueeze1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 10,744 kB
  • ctags: 15,132
  • sloc: python: 93,431; ansic: 787; makefile: 137; xml: 17
file content (84 lines) | stat: -rw-r--r-- 2,579 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import sqlalchemy as sa
from sqlalchemy import create_engine, MetaData, orm
from sqlalchemy import Column, ForeignKey
from sqlalchemy import Integer, String
from sqlalchemy.orm import mapper
from sqlalchemy.test import profiling

class Object(object):
    pass

class Q(Object):
    pass

class A(Object):
    pass

class C(Object):
    pass

class WC(C):
    pass

engine = create_engine('sqlite:///:memory:', echo=True)

sm = orm.sessionmaker(bind=engine)

SA_Session = orm.scoped_session(sm)

SA_Metadata = MetaData()

object_table =  sa.Table('Object',
                          SA_Metadata,
                          Column('ObjectID', Integer,primary_key=True),
                          Column('Type', String(1), nullable=False))

q_table = sa.Table('Q',
                   SA_Metadata,
                   Column('QID', Integer, ForeignKey('Object.ObjectID'),primary_key=True))

c_table = sa.Table('C',
                   SA_Metadata,
                   Column('CID', Integer, ForeignKey('Object.ObjectID'),primary_key=True))

wc_table = sa.Table('WC',
                    SA_Metadata,
                    Column('WCID', Integer, ForeignKey('C.CID'), primary_key=True))

a_table = sa.Table('A',
                   SA_Metadata,
                   Column('AID', Integer, ForeignKey('Object.ObjectID'),primary_key=True),
                   Column('QID', Integer, ForeignKey('Q.QID')),
                   Column('CID', Integer, ForeignKey('C.CID')))

mapper(Object, object_table, polymorphic_on=object_table.c.Type, polymorphic_identity='O')

mapper(Q, q_table, inherits=Object, polymorphic_identity='Q')
mapper(C, c_table, inherits=Object, polymorphic_identity='C')
mapper(WC, wc_table, inherits=C, polymorphic_identity='W')

mapper(A, a_table, inherits=Object, polymorphic_identity='A',
       properties = {
                     'Q' : orm.relation(Q,primaryjoin=a_table.c.QID==q_table.c.QID,
                                        backref='As'
                                        ),
                     'C' : orm.relation(C,primaryjoin=a_table.c.CID==c_table.c.CID,
                                        backref='A',
                                        uselist=False)
                     }
       )

SA_Metadata.create_all(engine)

@profiling.profiled('large_flush', always=True, sort=['file'])
def generate_error():
    q = Q()
    for j in range(100): #at 306 the error does not pop out (depending on recursion depth)
        a = A()
        a.Q = q
        a.C = WC()

    SA_Session.add(q)
    SA_Session.commit() #here the error pops out

generate_error()