sqlobject 3.13.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. sqlobject/__init__.py +15 -0
  2. sqlobject/__version__.py +8 -0
  3. sqlobject/boundattributes.py +124 -0
  4. sqlobject/cache.py +376 -0
  5. sqlobject/classregistry.py +138 -0
  6. sqlobject/col.py +2187 -0
  7. sqlobject/compat.py +59 -0
  8. sqlobject/conftest.py +64 -0
  9. sqlobject/constraints.py +77 -0
  10. sqlobject/converters.py +278 -0
  11. sqlobject/dbconnection.py +1137 -0
  12. sqlobject/dberrors.py +54 -0
  13. sqlobject/declarative.py +211 -0
  14. sqlobject/events.py +365 -0
  15. sqlobject/firebird/__init__.py +8 -0
  16. sqlobject/firebird/firebirdconnection.py +463 -0
  17. sqlobject/include/__init__.py +1 -0
  18. sqlobject/include/hashcol.py +109 -0
  19. sqlobject/include/tests/__init__.py +1 -0
  20. sqlobject/include/tests/test_hashcol.py +84 -0
  21. sqlobject/index.py +189 -0
  22. sqlobject/inheritance/__init__.py +551 -0
  23. sqlobject/inheritance/iteration.py +106 -0
  24. sqlobject/inheritance/tests/__init__.py +1 -0
  25. sqlobject/inheritance/tests/test_aggregates.py +23 -0
  26. sqlobject/inheritance/tests/test_asdict.py +48 -0
  27. sqlobject/inheritance/tests/test_deep_inheritance.py +114 -0
  28. sqlobject/inheritance/tests/test_destroy_cascade.py +23 -0
  29. sqlobject/inheritance/tests/test_foreignKey.py +94 -0
  30. sqlobject/inheritance/tests/test_indexes.py +42 -0
  31. sqlobject/inheritance/tests/test_inheritance.py +164 -0
  32. sqlobject/inheritance/tests/test_inheritance_tree.py +50 -0
  33. sqlobject/joins.py +656 -0
  34. sqlobject/main.py +1880 -0
  35. sqlobject/manager/__init__.py +1 -0
  36. sqlobject/manager/command.py +1309 -0
  37. sqlobject/maxdb/__init__.py +8 -0
  38. sqlobject/maxdb/maxdbconnection.py +320 -0
  39. sqlobject/maxdb/readme.txt +27 -0
  40. sqlobject/mssql/__init__.py +8 -0
  41. sqlobject/mssql/mssqlconnection.py +417 -0
  42. sqlobject/mysql/__init__.py +8 -0
  43. sqlobject/mysql/mysqlconnection.py +562 -0
  44. sqlobject/postgres/__init__.py +8 -0
  45. sqlobject/postgres/pgconnection.py +619 -0
  46. sqlobject/sqlbuilder.py +1655 -0
  47. sqlobject/sqlite/__init__.py +8 -0
  48. sqlobject/sqlite/sqliteconnection.py +418 -0
  49. sqlobject/sresults.py +377 -0
  50. sqlobject/styles.py +174 -0
  51. sqlobject/sybase/__init__.py +8 -0
  52. sqlobject/sybase/sybaseconnection.py +183 -0
  53. sqlobject/tests/__init__.py +1 -0
  54. sqlobject/tests/dbtest.py +363 -0
  55. sqlobject/tests/test_ForeignKey.py +133 -0
  56. sqlobject/tests/test_ForeignKey_cascade.py +150 -0
  57. sqlobject/tests/test_NoneValuedResultItem.py +33 -0
  58. sqlobject/tests/test_SQLMultipleJoin.py +65 -0
  59. sqlobject/tests/test_SQLRelatedJoin.py +114 -0
  60. sqlobject/tests/test_SingleJoin.py +30 -0
  61. sqlobject/tests/test_aggregates.py +75 -0
  62. sqlobject/tests/test_aliases.py +49 -0
  63. sqlobject/tests/test_asdict.py +18 -0
  64. sqlobject/tests/test_auto.py +218 -0
  65. sqlobject/tests/test_basic.py +359 -0
  66. sqlobject/tests/test_blob.py +34 -0
  67. sqlobject/tests/test_boundattributes.py +67 -0
  68. sqlobject/tests/test_cache.py +57 -0
  69. sqlobject/tests/test_class_hash.py +22 -0
  70. sqlobject/tests/test_columns_order.py +18 -0
  71. sqlobject/tests/test_combining_joins.py +47 -0
  72. sqlobject/tests/test_comparison.py +24 -0
  73. sqlobject/tests/test_compat.py +10 -0
  74. sqlobject/tests/test_complex_sorting.py +77 -0
  75. sqlobject/tests/test_constraints.py +43 -0
  76. sqlobject/tests/test_converters.py +276 -0
  77. sqlobject/tests/test_create_drop.py +29 -0
  78. sqlobject/tests/test_csvexport.py +101 -0
  79. sqlobject/tests/test_csvimport.py +21 -0
  80. sqlobject/tests/test_cyclic_reference.py +55 -0
  81. sqlobject/tests/test_datetime.py +171 -0
  82. sqlobject/tests/test_dbconnection.py +17 -0
  83. sqlobject/tests/test_decimal.py +63 -0
  84. sqlobject/tests/test_declarative.py +83 -0
  85. sqlobject/tests/test_default_style.py +65 -0
  86. sqlobject/tests/test_delete.py +74 -0
  87. sqlobject/tests/test_distinct.py +36 -0
  88. sqlobject/tests/test_empty.py +22 -0
  89. sqlobject/tests/test_enum.py +75 -0
  90. sqlobject/tests/test_events.py +142 -0
  91. sqlobject/tests/test_exceptions.py +40 -0
  92. sqlobject/tests/test_expire.py +29 -0
  93. sqlobject/tests/test_groupBy.py +45 -0
  94. sqlobject/tests/test_identity.py +29 -0
  95. sqlobject/tests/test_indexes.py +100 -0
  96. sqlobject/tests/test_inheritance.py +35 -0
  97. sqlobject/tests/test_joins.py +160 -0
  98. sqlobject/tests/test_joins_conditional.py +143 -0
  99. sqlobject/tests/test_jsonbcol.py +53 -0
  100. sqlobject/tests/test_jsoncol.py +56 -0
  101. sqlobject/tests/test_lazy.py +165 -0
  102. sqlobject/tests/test_md5.py +13 -0
  103. sqlobject/tests/test_mysql.py +50 -0
  104. sqlobject/tests/test_new_joins.py +165 -0
  105. sqlobject/tests/test_parse_uri.py +147 -0
  106. sqlobject/tests/test_paste.py +92 -0
  107. sqlobject/tests/test_perConnection.py +20 -0
  108. sqlobject/tests/test_pickle.py +42 -0
  109. sqlobject/tests/test_picklecol.py +44 -0
  110. sqlobject/tests/test_postgres.py +82 -0
  111. sqlobject/tests/test_reparent_sqlmeta.py +33 -0
  112. sqlobject/tests/test_schema.py +30 -0
  113. sqlobject/tests/test_select.py +218 -0
  114. sqlobject/tests/test_select_through.py +63 -0
  115. sqlobject/tests/test_setters.py +23 -0
  116. sqlobject/tests/test_slice.py +59 -0
  117. sqlobject/tests/test_sorting.py +80 -0
  118. sqlobject/tests/test_sqlbuilder.py +134 -0
  119. sqlobject/tests/test_sqlbuilder_dbspecific.py +66 -0
  120. sqlobject/tests/test_sqlbuilder_importproxy.py +55 -0
  121. sqlobject/tests/test_sqlbuilder_joins_instances.py +90 -0
  122. sqlobject/tests/test_sqlite.py +160 -0
  123. sqlobject/tests/test_sqlmeta_idName.py +52 -0
  124. sqlobject/tests/test_sqlobject_admin.py +38 -0
  125. sqlobject/tests/test_string_id.py +79 -0
  126. sqlobject/tests/test_style.py +36 -0
  127. sqlobject/tests/test_subqueries.py +142 -0
  128. sqlobject/tests/test_transactions.py +122 -0
  129. sqlobject/tests/test_unicode.py +84 -0
  130. sqlobject/tests/test_uuidcol.py +40 -0
  131. sqlobject/tests/test_validation.py +125 -0
  132. sqlobject/tests/test_views.py +159 -0
  133. sqlobject/util/__init__.py +1 -0
  134. sqlobject/util/csvexport.py +210 -0
  135. sqlobject/util/csvimport.py +366 -0
  136. sqlobject/util/moduleloader.py +35 -0
  137. sqlobject/util/threadinglocal.py +6 -0
  138. sqlobject/versioning/__init__.py +120 -0
  139. sqlobject/versioning/test/__init__.py +0 -0
  140. sqlobject/versioning/test/test_version.py +183 -0
  141. sqlobject/views.py +151 -0
  142. sqlobject/wsgi_middleware.py +109 -0
  143. sqlobject-3.13.1.data/scripts/sqlobject-admin +36 -0
  144. sqlobject-3.13.1.data/scripts/sqlobject-convertOldURI +19 -0
  145. sqlobject-3.13.1.dist-info/METADATA +177 -0
  146. sqlobject-3.13.1.dist-info/RECORD +149 -0
  147. sqlobject-3.13.1.dist-info/WHEEL +6 -0
  148. sqlobject-3.13.1.dist-info/entry_points.txt +4 -0
  149. sqlobject-3.13.1.dist-info/top_level.txt +1 -0
sqlobject/index.py ADDED
@@ -0,0 +1,189 @@
1
+ from itertools import count
2
+ from .converters import sqlrepr
3
+
4
+
5
+ creationOrder = count()
6
+
7
+
8
+ class SODatabaseIndex(object):
9
+
10
+ def __init__(self,
11
+ soClass,
12
+ name,
13
+ columns,
14
+ creationOrder,
15
+ unique=False):
16
+ self.soClass = soClass
17
+ self.name = name
18
+ self.descriptions = self.convertColumns(columns)
19
+ self.creationOrder = creationOrder
20
+ self.unique = unique
21
+
22
+ def get(self, *args, **kw):
23
+ if not self.unique:
24
+ raise AttributeError(
25
+ "'%s' object has no attribute 'get' "
26
+ "(index is not unique)" % self.name)
27
+ connection = kw.pop('connection', None)
28
+ if args and kw:
29
+ raise TypeError("You cannot mix named and unnamed arguments")
30
+ columns = [d['column'] for d in self.descriptions if 'column' in d]
31
+ if kw and len(kw) != len(columns) or \
32
+ args and len(args) != len(columns):
33
+ raise TypeError(
34
+ "get() takes exactly %d argument and an optional "
35
+ "named argument 'connection' (%d given)" % (
36
+ len(columns), len(args) + len(kw)))
37
+ if args:
38
+ kw = {}
39
+ for i in range(len(args)):
40
+ if columns[i].foreignName is not None:
41
+ kw[columns[i].foreignName] = args[i]
42
+ else:
43
+ kw[columns[i].name] = args[i]
44
+ return self.soClass.selectBy(connection=connection, **kw).getOne()
45
+
46
+ def convertColumns(self, columns):
47
+ """
48
+ Converts all the columns to dictionary descriptors;
49
+ dereferences string column names.
50
+ """
51
+ new = []
52
+ for desc in columns:
53
+ if not isinstance(desc, dict):
54
+ desc = {'column': desc}
55
+ if 'expression' in desc:
56
+ assert 'column' not in desc, (
57
+ 'You cannot provide both an expression and a column '
58
+ '(for %s in index %s in %s)' %
59
+ (desc, self.name, self.soClass))
60
+ assert 'length' not in desc, (
61
+ 'length does not apply to expressions (for %s in '
62
+ 'index %s in %s)' %
63
+ (desc, self.name, self.soClass))
64
+ new.append(desc)
65
+ continue
66
+ columnName = desc['column']
67
+ if not isinstance(columnName, str):
68
+ columnName = columnName.name
69
+ colDict = self.soClass.sqlmeta.columns
70
+ if columnName not in colDict:
71
+ for possible in colDict.values():
72
+ if possible.origName == columnName:
73
+ column = possible
74
+ break
75
+ else:
76
+ # None found
77
+ raise ValueError(
78
+ "The column by the name %r was not found "
79
+ "in the class %r" % (columnName, self.soClass))
80
+ else:
81
+ column = colDict[columnName]
82
+ desc['column'] = column
83
+ new.append(desc)
84
+ return new
85
+
86
+ def getExpression(self, desc, db):
87
+ if isinstance(desc['expression'], str):
88
+ return desc['expression']
89
+ else:
90
+ return sqlrepr(desc['expression'], db)
91
+
92
+ def sqliteCreateIndexSQL(self, soClass):
93
+ if self.unique:
94
+ uniqueOrIndex = 'UNIQUE INDEX'
95
+ else:
96
+ uniqueOrIndex = 'INDEX'
97
+ spec = []
98
+ for desc in self.descriptions:
99
+ if 'expression' in desc:
100
+ spec.append(self.getExpression(desc, 'sqlite'))
101
+ else:
102
+ spec.append(desc['column'].dbName)
103
+ ret = 'CREATE %s %s_%s ON %s (%s)' % \
104
+ (uniqueOrIndex,
105
+ self.soClass.sqlmeta.table,
106
+ self.name,
107
+ self.soClass.sqlmeta.table,
108
+ ', '.join(spec))
109
+ return ret
110
+
111
+ postgresCreateIndexSQL = maxdbCreateIndexSQL = mssqlCreateIndexSQL = \
112
+ sybaseCreateIndexSQL = firebirdCreateIndexSQL = sqliteCreateIndexSQL
113
+
114
+ def mysqlCreateIndexSQL(self, soClass):
115
+ if self.unique:
116
+ uniqueOrIndex = 'UNIQUE'
117
+ else:
118
+ uniqueOrIndex = 'INDEX'
119
+ spec = []
120
+ for desc in self.descriptions:
121
+ if 'expression' in desc:
122
+ spec.append(self.getExpression(desc, 'mysql'))
123
+ elif 'length' in desc:
124
+ spec.append('%s(%d)' % (desc['column'].dbName, desc['length']))
125
+ else:
126
+ spec.append(desc['column'].dbName)
127
+
128
+ return 'ALTER TABLE %s ADD %s %s (%s)' % \
129
+ (soClass.sqlmeta.table, uniqueOrIndex,
130
+ self.name,
131
+ ', '.join(spec))
132
+
133
+
134
+ class DatabaseIndex(object):
135
+ """
136
+ This takes a variable number of parameters, each of which is a
137
+ column for indexing. Each column may be a column object or the
138
+ string name of the column (*not* the database name). You may also
139
+ use dictionaries, to further customize the indexing of the column.
140
+ The dictionary may have certain keys:
141
+
142
+ 'column':
143
+ The column object or string identifier.
144
+ 'length':
145
+ MySQL will only index the first N characters if this is
146
+ given. For other databases this is ignored.
147
+ 'expression':
148
+ You can create an index based on an expression, e.g.,
149
+ 'lower(column)'. This can either be a string or a sqlbuilder
150
+ expression.
151
+
152
+ Further keys may be added to the column specs in the future.
153
+
154
+ The class also take the keyword argument `unique`; if true then
155
+ a UNIQUE index is created.
156
+ """
157
+
158
+ baseClass = SODatabaseIndex
159
+
160
+ def __init__(self, *columns, **kw):
161
+ kw['columns'] = columns
162
+ self.kw = kw
163
+ self.creationOrder = next(creationOrder)
164
+
165
+ def setName(self, value):
166
+ assert self.kw.get('name') is None, \
167
+ "You cannot change a name after it has already been set " \
168
+ "(from %s to %s)" % (self.kw['name'], value)
169
+ self.kw['name'] = value
170
+
171
+ def _get_name(self):
172
+ return self.kw['name']
173
+
174
+ def _set_name(self, value):
175
+ self.setName(value)
176
+
177
+ name = property(_get_name, _set_name)
178
+
179
+ def withClass(self, soClass):
180
+ return self.baseClass(soClass=soClass,
181
+ creationOrder=self.creationOrder, **self.kw)
182
+
183
+ def __repr__(self):
184
+ return '<%s %s %s>' % (
185
+ self.__class__.__name__,
186
+ hex(abs(id(self)))[2:],
187
+ self.kw)
188
+
189
+ __all__ = ['DatabaseIndex']