1from SQLGenerator import SQLGenerator 2 3 4class MySQLSQLGenerator(SQLGenerator): 5 6 def sqlSupportsDefaultValues(self): 7 return True 8 9 10class Klasses(object): 11 12 def dropDatabaseSQL(self, dbName): 13 return 'drop database if exists %s;\n' % dbName 14 15 def dropTablesSQL(self): 16 sql = [] 17 for tableName in reversed(self.auxiliaryTableNames()): 18 sql.append('drop table if exists %s;\n' % tableName) 19 for klass in reversed(self._model._allKlassesInOrder): 20 sql.append('drop table if exists %s;\n' % klass.name()) 21 sql.append('\n') 22 return ''.join(sql) 23 24 def createDatabaseSQL(self, dbName): 25 return 'create database %s;\n' % dbName 26 27 def useDatabaseSQL(self, dbName): 28 return 'use %s;\n\n' % dbName 29 30 def listTablesSQL(self): 31 return 'show tables\n\n' 32 33 34class Klass(object): 35 36 def writePostCreateTable(self, generator, out): 37 start = self.setting('StartingSerialNum', None) 38 if start: 39 out.write('alter table %s auto_increment=%s;\n' % ( 40 self.sqlTableName(), start)) 41 42 def primaryKeySQLDef(self, generator): 43 return ' %s int not null primary key auto_increment,\n' % ( 44 self.sqlSerialColumnName().ljust(self.maxNameWidth()),) 45 46 def writeIndexSQLDefsInTable(self, wr): 47 for attr in self.allAttrs(): 48 if attr.boolForKey('isIndexed') and attr.hasSQLColumn(): 49 wr(',\n') 50 wr(' index (%s)' % attr.sqlName()) 51 wr('\n') 52 53 54class EnumAttr(object): 55 56 def nativeEnumSQLType(self): 57 return 'enum(%s)' % ', '.join(['"%s"' % enum for enum in self.enums()]) 58 59 60class StringAttr(object): 61 62 def sqlType(self): 63 # @@ 2000-11-11 ce: cache this 64 if not self.get('Max'): 65 return 'varchar(100) /* WARNING: NO LENGTH SPECIFIED */' 66 max = int(self['Max']) # @@ 2000-11-12 ce: won't need int() after using types 67 if max > 65535: 68 return 'longtext' 69 if max > 255: 70 return 'text' 71 if self.get('Min') and int(self['Min']) == max: 72 return 'char(%s)' % max 73 else: 74 return 'varchar(%s)' % max 75 76 77class ObjRefAttr(object): 78 79 def sqlType(self): 80 if self.setting('UseBigIntObjRefColumns', False): 81 return 'bigint unsigned /* %s */' % self['Type'] 82 else: 83 return 'int unsigned' 84