quotes field and tablenames in mysql, thanks Toomim

This commit is contained in:
mdipierro
2012-07-04 17:37:49 -05:00
parent 5e110aec52
commit 31bbd7707e
2 changed files with 35 additions and 28 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.00.0 (2012-07-04 17:05:24) dev Version 2.00.0 (2012-07-04 17:37:46) dev
+34 -27
View File
@@ -619,6 +619,9 @@ class BaseAdapter(ConnectionPool):
def trigger_name(self,tablename): def trigger_name(self,tablename):
return '%s_sequence' % tablename return '%s_sequence' % tablename
def varquote(self,name):
return name
def create_table(self, table, def create_table(self, table,
migrate=True, migrate=True,
fake_migrate=False, fake_migrate=False,
@@ -661,24 +664,24 @@ class BaseAdapter(ConnectionPool):
TFK[rtablename] = {} TFK[rtablename] = {}
TFK[rtablename][rfieldname] = field.name TFK[rtablename][rfieldname] = field.name
else: else:
ftype = ftype + self.types['reference FK'] \ ftype = ftype + self.types['reference FK'] % dict(
% dict( constraint_name = constraint_name, # should be quoted
constraint_name=constraint_name, table_name=self.varquote(tablename),
table_name=tablename, field_name=self.varquote(field.name),
field_name=field.name, foreign_key = '%s (%s)' % (self.varquote(rtablename),
foreign_key='%s (%s)'%(rtablename, rfieldname), self.varquote(rfieldname)),
on_delete_action=field.ondelete) on_delete_action=field.ondelete)
else: else:
# make a guess here for circular references # make a guess here for circular references
id_fieldname = referenced in table._db \ id_fieldname = referenced in table._db \
and table._db[referenced]._id.name or 'id' and table._db[referenced]._id.name or 'id'
ftype = self.types[field.type[:9]] % \ ftype = self.types[field.type[:9]] % dict(
dict(table_name=tablename, index_name = self.varquote(tablename+'__idx'),
field_name=field.name, field_name = self.varquote(field.name),
constraint_name=constraint_name, constraint_name = self.varquote(constraint_name),
foreign_key=referenced + \ foreign_key = '%s (%s)' % (self.varquote(referenced),
('(%s)' % id_fieldname), self.varquote(id_fieldname)),
on_delete_action=field.ondelete) on_delete_action=field.ondelete)
elif field.type.startswith('list:reference'): elif field.type.startswith('list:reference'):
ftype = self.types[field.type[:14]] ftype = self.types[field.type[:14]]
elif field.type.startswith('decimal'): elif field.type.startswith('decimal'):
@@ -737,13 +740,13 @@ class BaseAdapter(ConnectionPool):
# Postgres - PostGIS: # Postgres - PostGIS:
# geometry fields are added after the table has been created, not now # geometry fields are added after the table has been created, not now
if not (self.dbengine == 'postgres' and field.type.startswith('geom')): if not (self.dbengine == 'postgres' and field.type.startswith('geom')):
fields.append('%s %s' %(field.name, ftype)) fields.append('%s %s' % (self.varquote(field.name), ftype))
other = ';' other = ';'
# backend-specific extensions to fields # backend-specific extensions to fields
if self.dbengine == 'mysql': if self.dbengine == 'mysql':
if not hasattr(table, "_primarykey"): if not hasattr(table, "_primarykey"):
fields.append('PRIMARY KEY(%s)' % table._id.name) fields.append('PRIMARY KEY(%s)' % self.varquote(table._id.name))
other = ' ENGINE=InnoDB CHARACTER SET utf8;' other = ' ENGINE=InnoDB CHARACTER SET utf8;'
fields = ',\n '.join(fields) fields = ',\n '.join(fields)
@@ -752,12 +755,12 @@ class BaseAdapter(ConnectionPool):
pkeys = table._db[rtablename]._primarykey pkeys = table._db[rtablename]._primarykey
fkeys = [ rfields[k] for k in pkeys ] fkeys = [ rfields[k] for k in pkeys ]
fields = fields + ',\n ' + \ fields = fields + ',\n ' + \
self.types['reference TFK'] %\ self.types['reference TFK'] % dict(
dict(table_name=tablename, table_name = tablename,
field_name=', '.join(fkeys), field_name=', '.join(fkeys),
foreign_table=rtablename, foreign_table = rtablename,
foreign_key=', '.join(pkeys), foreign_key = ', '.join(pkeys),
on_delete_action=field.ondelete) on_delete_action = field.ondelete)
if hasattr(table,'_primarykey'): if hasattr(table,'_primarykey'):
query = '''CREATE TABLE %s(\n %s,\n %s) %s''' % \ query = '''CREATE TABLE %s(\n %s,\n %s) %s''' % \
@@ -1005,7 +1008,7 @@ class BaseAdapter(ConnectionPool):
logfile.write('success!\n') logfile.write('success!\n')
def _insert(self, table, fields): def _insert(self, table, fields):
keys = ','.join(f.name for f,v in fields) keys = ','.join(self.varquote(f.name) for f,v in fields)
values = ','.join(self.expand(v,f.type) for f,v in fields) values = ','.join(self.expand(v,f.type) for f,v in fields)
return 'INSERT INTO %s(%s) VALUES (%s);' % (table, keys, values) return 'INSERT INTO %s(%s) VALUES (%s);' % (table, keys, values)
@@ -2030,14 +2033,17 @@ class MySQLAdapter(BaseAdapter):
'time': 'TIME', 'time': 'TIME',
'datetime': 'DATETIME', 'datetime': 'DATETIME',
'id': 'INT AUTO_INCREMENT NOT NULL', 'id': 'INT AUTO_INCREMENT NOT NULL',
'reference': 'INT, INDEX %(field_name)s__idx (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'reference': 'INT, INDEX %(index_name)s (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s',
'list:integer': 'LONGTEXT', 'list:integer': 'LONGTEXT',
'list:string': 'LONGTEXT', 'list:string': 'LONGTEXT',
'list:reference': 'LONGTEXT', 'list:reference': 'LONGTEXT',
'big-id': 'BIGINT AUTO_INCREMENT NOT NULL', 'big-id': 'BIGINT AUTO_INCREMENT NOT NULL',
'big-reference': 'BIGINT, INDEX %(field_name)s__idx (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s', 'big-reference': 'BIGINT, INDEX %(index_name)s (%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES %(foreign_key)s ON DELETE %(on_delete_action)s',
} }
def varquote(self,name):
return '`%`' % name
def RANDOM(self): def RANDOM(self):
return 'RAND()' return 'RAND()'
@@ -8144,10 +8150,11 @@ class Field(Expression):
return True return True
def __str__(self): def __str__(self):
quote = self.db._adapter.varquote
try: try:
return '%s.%s' % (self.tablename, self.name) return '%s.%s' % (varquote(self.tablename), quote(self.name))
except: except:
return '<no table>.%s' % self.name return '<no table>.%s' % quote(self.name)
class Query(object): class Query(object):