Skip to content

Commit 8620fa1

Browse files
committed
Applied the patch 1333498 by Jeff Bauer: String IDs. I refactored the patch
and updated documentation. git-svn-id: http://svn.colorstudy.com/SQLObject/trunk@1136 95a46c32-92d2-0310-94a5-8d71aeb3d4b3
1 parent 6b66315 commit 8620fa1

11 files changed

Lines changed: 50 additions & 34 deletions

File tree

docs/FAQ.txt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,12 @@ latitude/longitude columns.
279279
Non-Integer IDs
280280
---------------
281281

282-
Yes, you can use non-integer IDs, but only in CVS_ now.
282+
Yes, you can use non-integer IDs.
283283

284-
.. _CVS: http://sqlobject.org/#anonymous-cvs
285-
286-
If you use non-integer IDs, you will not be able to use automatic
287-
``CREATE TABLE`` generation (i.e., ``createTable``). You also will
288-
have to give your own ID values when creating an object, like::
284+
If you use non-integer IDs, you will not be able to use automatic ``CREATE
285+
TABLE`` generation (i.e., ``createTable``); SQLObject can create tables
286+
with int or str IDs. You also will have to give your own ID values when
287+
creating an object, like::
289288

290289
color = Something(id="blue", r=0, b=100, g=0)
291290

@@ -308,7 +307,7 @@ Instead of ``str()`` you may use ``int()`` or whatever else you want.
308307
This will be resolved in a future version when ID column types can be
309308
declared like other columns.
310309

311-
Additionally you can set _idType = str in you SQLObject class.
310+
Additionally you can set idType=str in you SQLObject class.
312311

313312

314313
Binary Values

docs/SQLObject.txt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,11 +1396,12 @@ column name.
13961396
Non-Integer Keys
13971397
----------------
13981398

1399-
While not strictly a legacy database issue, this fits into the
1400-
category of "irregularities". If you use non-integer keys, all
1401-
primary key management is up to you. You must create the table
1402-
yourself, and when you create instances you must pass a ``id`` keyword
1403-
argument into constructor (like ``Person(id='555-55-5555', ...)``).
1399+
While not strictly a legacy database issue, this fits into the category of
1400+
"irregularities". If you use non-integer keys, all primary key management
1401+
is up to you. You must create the table yourself (SQLObject can create
1402+
tables with int or str IDs), and when you create instances you must pass a
1403+
``id`` keyword argument into constructor
1404+
(like ``Person(id='555-55-5555', ...)``).
14041405

14051406
DBConnection: Database Connections
14061407
==================================

sqlobject/col.py

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -687,30 +687,21 @@ class FloatCol(Col):
687687

688688

689689
class SOKeyCol(SOCol):
690+
key_type = {int: "INT", str: "TEXT"}
690691

691692
# 3-03 @@: this should have a simplified constructor
692693
# Should provide foreign key information for other DBs.
693694

694-
def _mysqlType(self):
695-
return 'INT'
696-
697-
def _sqliteType(self):
698-
return 'INT'
699-
700-
def _postgresType(self):
701-
return 'INT'
695+
def _sqlType(self):
696+
return self.key_type[self.soClass.sqlmeta.idType]
702697

703698
def _sybaseType(self):
704-
return 'NUMERIC(18,0) NULL'
699+
key_type = {int: "NUMERIC(18,0) NULL", str: "TEXT"}
700+
return key_type[self.soClass.sqlmeta.idType]
705701

706702
def _mssqlType(self):
707-
return 'INT NULL'
708-
709-
def _firebirdType(self):
710-
return 'INT'
711-
712-
def _maxdbType(self):
713-
return 'INT'
703+
key_type = {int: "INT NULL", str: "TEXT"}
704+
return key_type[self.soClass.sqlmeta.idType]
714705

715706
class KeyCol(Col):
716707

sqlobject/firebird/firebirdconnection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ def createColumn(self, soClass, col):
131131
return col.firebirdCreateSQL()
132132

133133
def createIDColumn(self, soClass):
134-
return '%s INT NOT NULL PRIMARY KEY' % soClass.sqlmeta.idName
134+
key_type = {int: "INT", str: "TEXT"}[soClass.sqlmeta.idType]
135+
return '%s %s NOT NULL PRIMARY KEY' % (soClass.sqlmeta.idName, key_type)
135136

136137
def createIndexSQL(self, soClass, index):
137138
return index.firebirdCreateIndexSQL(soClass)

sqlobject/maxdb/maxdbconnection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ def createColumn(self, soClass, col):
172172
return col.maxdbCreateSQL()
173173

174174
def createIDColumn(self, soClass):
175-
return '%s INT PRIMARY KEY' % soClass.sqlmeta.idName
175+
key_type = {int: "INT", str: "TEXT"}[soClass.sqlmeta.idType]
176+
return '%s %s PRIMARY KEY' % (soClass.sqlmeta.idName, key_type)
176177

177178
def createIndexSQL(self, soClass, index):
178179
return index.maxdbCreateIndexSQL(soClass)

sqlobject/mssql/mssqlconnection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ def createColumn(self, soClass, col):
129129
return col.mssqlCreateSQL()
130130

131131
def createIDColumn(self, soClass):
132-
return '%s INT IDENTITY UNIQUE' % soClass.sqlmeta.idName
132+
key_type = {int: "INT", str: "TEXT"}[soClass.sqlmeta.idType]
133+
return '%s %s IDENTITY UNIQUE' % (soClass.sqlmeta.idName, key_type)
133134

134135
def createIndexSQL(self, soClass, index):
135136
return index.mssqlCreateIndexSQL(soClass)

sqlobject/mysql/mysqlconnection.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ def createIndexSQL(self, soClass, index):
9999
return index.mysqlCreateIndexSQL(soClass)
100100

101101
def createIDColumn(self, soClass):
102+
if soClass.sqlmeta.idType == str:
103+
return '%s TEXT PRIMARY KEY' % soClass.sqlmeta.idName
102104
return '%s INT PRIMARY KEY AUTO_INCREMENT' % soClass.sqlmeta.idName
103105

104106
def joinSQLType(self, join):

sqlobject/postgres/pgconnection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ def createIndexSQL(self, soClass, index):
145145
return index.postgresCreateIndexSQL(soClass)
146146

147147
def createIDColumn(self, soClass):
148-
return '%s SERIAL PRIMARY KEY' % soClass.sqlmeta.idName
148+
key_type = {int: "SERIAL", str: "TEXT"}[soClass.sqlmeta.idType]
149+
return '%s %s PRIMARY KEY' % (soClass.sqlmeta.idName, key_type)
149150

150151
def dropTable(self, tableName, cascade=False):
151152
if self.server_version[:3] <= "7.2":

sqlobject/sqlite/sqliteconnection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ def createReferenceConstraint(self, soClass, col):
120120
return None
121121

122122
def createIDColumn(self, soClass):
123-
return '%s INTEGER PRIMARY KEY' % soClass.sqlmeta.idName
123+
key_type = {int: "INTEGER", str: "TEXT"}[soClass.sqlmeta.idType]
124+
return '%s %s PRIMARY KEY' % (soClass.sqlmeta.idName, key_type)
124125

125126
def joinSQLType(self, join):
126127
return 'INT NOT NULL'

sqlobject/sybase/sybaseconnection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ def createColumn(self, soClass, col):
102102
return col.sybaseCreateSQL()
103103

104104
def createIDColumn(self, soClass):
105-
return '%s NUMERIC(18,0) IDENTITY UNIQUE' % soClass.sqlmeta.idName
105+
key_type = {int: "NUMERIC(18,0)", str: "TEXT"}[soClass.sqlmeta.idType]
106+
return '%s %s IDENTITY UNIQUE' % (soClass.sqlmeta.idName, key_type)
106107

107108
def createIndexSQL(self, soClass, index):
108109
return index.sybaseCreateIndexSQL(soClass)

0 commit comments

Comments
 (0)