我有一个使用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或调试导致此错误的原因的更好方法?
答案 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