from ..adapters.mysql import MySQL from ..helpers.methods import varquote_aux from .base import SQLDialect from . import dialects, sqltype_for @dialects.register_for(MySQL) class MySQLDialect(SQLDialect): quote_template = "`%s`" @sqltype_for("datetime") def type_datetime(self): return "DATETIME" @sqltype_for("text") def type_text(self): return "LONGTEXT" @sqltype_for("blob") def type_blob(self): return "LONGBLOB" @sqltype_for("bigint") def type_bigint(self): return "BIGINT" @sqltype_for("id") def type_id(self): return "INT AUTO_INCREMENT NOT NULL" @sqltype_for("big-id") def type_big_id(self): return "BIGINT AUTO_INCREMENT NOT NULL" @sqltype_for("reference") def type_reference(self): return ( "INT %(null)s %(unique)s, INDEX %(index_name)s " + "(%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES " + "%(foreign_key)s ON DELETE %(on_delete_action)s" ) @sqltype_for("big-reference") def type_big_reference(self): return ( "BIGINT %(null)s %(unique)s, INDEX %(index_name)s " + "(%(field_name)s), FOREIGN KEY (%(field_name)s) REFERENCES " + "%(foreign_key)s ON DELETE %(on_delete_action)s" ) @sqltype_for("reference FK") def type_reference_fk(self): return ( ", CONSTRAINT `FK_%(constraint_name)s` FOREIGN KEY " + "(%(field_name)s) REFERENCES %(foreign_key)s ON DELETE " + "%(on_delete_action)s" ) def varquote(self, val): return varquote_aux(val, "`%s`") def insert_empty(self, table): return "INSERT INTO %s VALUES (DEFAULT);" % table def delete(self, table, where=None): tablename = self.writing_alias(table) whr = "" if where: whr = " %s" % self.where(where) return "DELETE %s FROM %s%s;" % (table.sql_shortref, tablename, whr) @property def random(self): return "RAND()" def substring(self, field, parameters, query_env={}): return "SUBSTRING(%s,%s,%s)" % ( self.expand(field, query_env=query_env), parameters[0], parameters[1], ) def epoch(self, first, query_env={}): return "UNIX_TIMESTAMP(%s)" % self.expand(first, query_env=query_env) def concat(self, *items, **kwargs): query_env = kwargs.get("query_env", {}) tmp = (self.expand(x, "string", query_env=query_env) for x in items) return "CONCAT(%s)" % ",".join(tmp) def regexp(self, first, second, query_env={}): return "(%s REGEXP %s)" % ( self.expand(first, query_env=query_env), self.expand(second, "string", query_env=query_env), ) def cast(self, first, second, query_env={}): if second == "LONGTEXT": second = "CHAR" return "CAST(%s AS %s)" % (first, second) def drop_table(self, table, mode): # breaks db integrity but without this mysql does not drop table return [ "SET FOREIGN_KEY_CHECKS=0;", "DROP TABLE %s;" % table._rname, "SET FOREIGN_KEY_CHECKS=1;", ] def drop_index(self, name, table): return "DROP INDEX %s ON %s;" % (self.quote(name), table._rname)