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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
"""
>>> from django.db.backends.ansi import sql
# so we can test with a predicatable constraint setting
>>> real_cnst = Mod._meta.connection_info.backend.supports_constraints
>>> Mod._meta.connection_info.backend.supports_constraints = True
# generate create sql
>>> builder = sql.SchemaBuilder()
>>> builder.get_create_table(Car)
([BoundStatement('CREATE TABLE "ansi_sql_car" (...);')], {})
>>> builder.models_already_seen
Set([<class 'othertests.ansi_sql.Car'>])
>>> builder.models_already_seen = set()
# test that styles are used
>>> builder.get_create_table(Car, style=mockstyle())
([BoundStatement('SQL_KEYWORD(CREATE TABLE) SQL_TABLE("ansi_sql_car") (...SQL_FIELD("id")...);')], {})
# test pending relationships
>>> builder.models_already_seen = set()
>>> builder.get_create_table(Mod)
([BoundStatement('CREATE TABLE "ansi_sql_mod" (..."car_id" integer NOT NULL,...);')], {<class 'othertests.ansi_sql.Car'>: [BoundStatement('ALTER TABLE "ansi_sql_mod" ADD CONSTRAINT ... FOREIGN KEY ("car_id") REFERENCES "ansi_sql_car" ("id");')]})
>>> builder.models_already_seen = set()
>>> builder.get_create_table(Car)
([BoundStatement('CREATE TABLE "ansi_sql_car" (...);')], {})
>>> builder.get_create_table(Mod)
([BoundStatement('CREATE TABLE "ansi_sql_mod" (..."car_id" integer NOT NULL REFERENCES "ansi_sql_car" ("id"),...);')], {})
# test many-many
>>> builder.get_create_table(Collector)
([BoundStatement('CREATE TABLE "ansi_sql_collector" (...);')], {})
>>> builder.get_create_many_to_many(Collector)
{<class 'othertests.ansi_sql.Car'>: [BoundStatement('CREATE TABLE "ansi_sql_collector_cars" (...);')]}
# test indexes
>>> builder.get_create_indexes(Car)
[]
>>> builder.get_create_indexes(Mod)
[BoundStatement('CREATE INDEX ... ON "ansi_sql_mod" ("car_id");'), BoundStatement('CREATE INDEX ... ON "ansi_sql_mod" ("part");')]
>>> builder.get_create_indexes(Collector)
[]
# test initial data
# patch builder so that it looks for initial data where we want it to
>>> builder.get_initialdata_path = othertests_sql
>>> builder.get_initialdata(Car)
[BoundStatement('insert into ansi_sql_car (...)...values (...);')]
# test drop
>>> builder.get_drop_table(Mod)
[BoundStatement('DROP TABLE "ansi_sql_mod";')]
>>> builder.get_drop_table(Mod, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_mod";')]
>>> builder.get_drop_table(Car)
[BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> builder.get_drop_table(Car, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> builder.tables = ['ansi_sql_car', 'ansi_sql_mod', 'ansi_sql_collector']
>>> Mod._meta.connection_info.backend.supports_constraints = False
>>> builder.get_drop_table(Car, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> Mod._meta.connection_info.backend.supports_constraints = True
>>> builder.get_drop_table(Car, cascade=True)
[BoundStatement('ALTER TABLE "ansi_sql_mod" ...'), BoundStatement('DROP TABLE "ansi_sql_car";')]
>>> builder.get_drop_table(Collector)
[BoundStatement('DROP TABLE "ansi_sql_collector";')]
>>> builder.get_drop_table(Collector, cascade=True)
[BoundStatement('DROP TABLE "ansi_sql_collector_cars";'), BoundStatement('DROP TABLE "ansi_sql_collector";')]
>>> Mod._meta.connection_info.backend.supports_constraints = real_cnst
"""
import os
from django.db import models
from django.core.management import install
# For Python 2.3
if not hasattr(__builtins__, 'set'):
from sets import Set as set
# test models
class Car(models.Model):
make = models.CharField(maxlength=32)
model = models.CharField(maxlength=32)
year = models.IntegerField()
condition = models.CharField(maxlength=32)
class Meta:
app_label = 'ansi_sql'
class Collector(models.Model):
name = models.CharField(maxlength=32)
cars = models.ManyToManyField(Car)
class Meta:
app_label = 'ansi_sql'
class Mod(models.Model):
car = models.ForeignKey(Car)
part = models.CharField(maxlength=32, db_index=True)
description = models.TextField()
class Meta:
app_label = 'ansi_sql'
class mockstyle:
"""mock style that wraps text in STYLE(text), for testing"""
def __getattr__(self, attr):
if attr in ('ERROR', 'ERROR_OUTPUT', 'SQL_FIELD', 'SQL_COLTYPE',
'SQL_KEYWORD', 'SQL_TABLE'):
return lambda text: "%s(%s)" % (attr, text)
def othertests_sql(mod):
"""Look in othertests/sql for sql initialdata"""
return os.path.normpath(os.path.join(os.path.dirname(__file__), 'sql'))
# install my stuff
Car.objects.install()
Collector.objects.install()
Mod.objects.install()
|