2016-08-07 10 views
-1

ich springboot + Mybatis und laufen mit dem SpringJUnit4ClassRunner, verwenden Sie die Standarddatenbank h2 und die Skripte:durch com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception unbekannte Spalte verursacht

create table sql:

create TABLE IF NOT EXISTS `test_company` (
    `id`   bigint unsigned not null auto_increment, 
    `pid`   bigint DEFAULT null COMMENT '', 
    `outer_id` bigint DEFAULT null COMMENT '', 
    `name`  VARCHAR(256) DEFAULT NULL COMMENT '', 
    `parent_company_name` VARCHAR(256) DEFAULT NULL COMMENT '', 
    `user_id` bigint DEFAULT NULL COMMENT '用户ID', 
    `user_name` VARCHAR(64) DEFAULT NULL COMMENT '', 
    `type`  INTEGER DEFAULT null COMMENT '', 
    `level`  INTEGER DEFAULT null COMMENT '', 
    `status`  INTEGER DEFAULT null COMMENT '' 
); 

das Modell Firma:

@Data 
@NoArgsConstructor 
public class Company implements Serializable { 

    private static final long serialVersionUID = -5822686079080905768L; 
    private Long id; private Long pid; 
    private Long outerId; 
    private String name; 
    private String parentCompanyName; 
    private Long userId; 
    private String userName; 
    private Integer type; 
    private Integer level;  
    private Integer status; 
} 

die resultMap von Mapper:

<resultMap id="CompanyMap" type="Company"> 
    <id column="id" property="id"/> 
    <result column="pid" property="pid"/> 
    <result column="outer_id" property="outerId"/> 
    <result column="name" property="name"/> 
    <result column="parent_company_name" property="parentCompanyName"/> 
    <result column="user_id" property="userId"/> 
    <result column="user_name" property="userName"/> 
    <result column="type" property="type"/> 
    <result column="level" property="level"/> 
    <result column="status" property="status"/> 
</result> 

einige sqls:

<sql id="tb"> 
    test_company 
</sql> 

<sql id="cols_all"> 
    id, <include refid="cols_exclude_id" /> 
</sql> 

<sql id="cols_exclude_id"> 
    pid, outer_id, `name`, `parent_company_name`, user_id, user_name, `type`, `level`, status 
</sql> 

<sql id="vals"> 
    #{pid}, #{outerId}, #{name}, #{parentCompanyName}, #{userId}, #{userName}, #{type}, #{level}, #{status} 
</sql> 

SQL erstellen:

<insert id="create" parameterType="Company" keyProperty="id" useGeneratedKeys="true"> 
    INSERT INTO 
    <include refid="tb" /> 
    (<include refid="cols_exclude_id" />) 
    VALUES 
    (<include refid="vals" />) 
</insert> 

es gut läuft, bevor es nicht die Spalte parent_company_name,

aber wenn ich die Spalte parent_company_name und die DAO erneut ausführen hinzugefügt Methode mit create es hatte diesen Fehler

org.springframework.jdbc.BadSqlGrammarException: 
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'parent_company_name' in 'field list' 
### The error may involve Company.create-Inline 
### The error occurred while setting parameters 

meine IDE war IntelliJ IDEA, ich weiß nicht, ob es durch den Cache oder etwas anderes verursacht, ich habe nur eine neue Spalte hinzugefügt und überprüft alle SQL-Skripte war korrekt.

Antwort

0

Von dem, was ich verstehe, Sie verwenden Spring-Boot-und Migrationsskripts schreiben und ich nehme an, dass dies Flyway oder ein anderes Migrationstool ist. Beachten Sie, dass ein einmal ausgeführtes Migrationsscript nicht erneut ausgeführt wird, wenn Sie es nicht für die Überprüfung bei der Migration oder für andere Konfigurationen konfiguriert haben, die die Migration möglicherweise verwendet.

Sie sollten also Ihre Datenbank überprüfen, um festzustellen, ob die Spalte tatsächlich erstellt wurde. Wenn dies nicht der Fall ist, müssen Sie ein zweites Migrationsscript schreiben, um die vorhandene Tabelle zu ändern, anstatt die Spalte parent_company_name in das ursprüngliche Skript einzufügen. so wird Ihre Version 2 Migration haben:

ALTER TABLE `test_company` ADD COLUMN `parent_company_name` VARCHAR(256) DEFAULT NULL COMMENT ''; 

Alternativ, wenn Sie flyway verwenden und Sie sind immer noch im Entwicklungsmodus können Sie eine validate auf Migrate tun und sauber auf Validierungsfehler auf true gesetzt, so dass es die Datenbank reinigt und führt Ihr Migrationsscript erneut aus.

+0

danke, test von h2, es wird eine tabelle in meinem lokalen server von mysql, und sollte ihre sql 'alert table ...' zu aktualisieren datenbank. –

+0

@BenD wenn diese Antwort für Sie funktioniert. bitte als richtige Antwort markieren. – Sohlowmawn

Verwandte Themen