Sequelize播种者抱怨表中不存在一列

时间:2019-05-06 19:27:54

标签: mysql node.js sequelize.js

我有一个使用sequelize的应用程序,我们已经到了很多迁移的地步。我们决定,当我们创建新数据库时,我们想跳过迁移,而只是使用最新模型定义中的sequelize.sync命令来构建数据库模式。我一直在测试这种方法,该命令按预期工作:

async function syncDb() {
  const res = await db.sequelize.sync({ force: true });
  process.exit();
}

但是问题是当我尝试运行播种器时,我收到有关模型中未定义的缺少列的错误,当我使用mysql工作台检查它们时,它们也不在数据库中。例如,我们有一个名为“ practices”的表,该表具有许多列,但没有createdAt列。 mysql workbench中生成的表没有createdAt列,并且timestamps选项设置为false。

在我的种子文件中,我执行bulkInsert:

return queryInterface.bulkInsert('practices', [
  { data },
  etc...
]);

自然地,bulkInsert中的数据字段没有任何createdAt字段,但是当我运行sequelize db:seed:all --debug

时,我总是收到此烦人的错误消息
  

== 20180515000000-实践:迁移=======

     

错误:SequelizeDatabaseError:字段“ createdAt”没有默认值       在Query.formatError(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/sequelize/lib/dialects/mysql/query.js:247:16)       在Query.handler上[作为onResult](/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/sequelize/lib/dialects/mysql/query.js:68:23)       在Query.execute(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/commands/command.js:30:14)       在Connection.handlePacket(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/connection.js:449:32)       在PacketParser.Connection.packetParser.p [如onPacket](/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/connection.js:72:12)       在PacketParser.executeStart(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/packet_parser.js:75:16)       在Socket.Connection.stream.on.data(/Users/abdulahmad/Desktop/icanotes/development/api/node_modules/mysql2/lib/connection.js:79:25)       在emitOne上(events.js:116:13)       在Socket.emit(events.js:211:7)       在addChunk(_stream_visible.js:263:12)       在readAddChunk(_stream_visible.js:250:11)       在Socket.Readable.push(_stream_read.js:208:10)       在TCP.onread(net.js:597:20)

此错误并不能告诉我哪个种子播发器出现了故障,从输出来看,看来种子播种器是迄今为止唯一运行的实践。

所以我试图找出问题出在哪里,因为在习俗表中没有createdAt,并且我没有插入任何createdAt字段,所以我尝试注释掉整个种子文件的内容,但我仍然收到错误...怎么可能?播种机实际上并没有插入任何内容,现在看起来像这样:

up: (queryInterface, Sequelize) => {
  // empty
}

是否有办法找出正在运行的sql或调试导致此错误的原因的更好方法?

1 个答案:

答案 0 :(得分:-1)

与文档bulkInsert中一样,我们可以传递与bulkCreate的选项类似的其他选项。在bulkCreate选项中,我们可以指定要插入的字段(默认为所有字段)。

所以您可以这样使用

# dataframes to store data
df = pd.DataFrame(os.listdir(), columns=['filenames'])
df = df[df['filenames'].str.contains(".png|.jpg|.jpeg")]
df['filenames'] = '\\' + df['filenames']
df1 = [] #Empty list to record details 

# Function 1
def extract_details(df):
    for filename in df['filenames']:
        get_details(filename)

# Function 2
def get_details(filename):
    image = os.getcwd() + filename
    data = pytesseract.image_to_string(Image.open(image))
    .
    .
    . 
    data = ''.join(a) 
    print(filename, data)
    df1.append([filename, data])

df_data = pd.DataFrame(df1, columns=['filenames', 'data']) # Container     for final  output
df_data.to_csv('data_list.csv') # Write output to a csv file 
df_data.to_excel('data_list.xlsx') # Write output to an excel file