Я работаю над реализацией блокчейна на Rust, используя MySQL в качестве базы данных. У меня есть две таблицы: блоки и транзакции. Транзакции связываются с блоками через внешний ключ (block_index).
Server (ServerError { код: 1048, сообщение: «Столбец 'block_index' не может быть нулевым», состояние: «23000» })
I проверил значение block_index в журналах отладки перед SQL-запросом.
Я подтвердил, что Block_index = 1 существует в таблице блоков.
Я выполнил запрос вручную, и он работает, когда выполняется напрямую в MySQL
Я добавил println! чтобы просмотреть данные перед вставкой данных, чтобы убедиться, что ничего не было нулевым или конкретный индекс_блока не был нулевым, я жестко запрограммировал индекс_блока равным 1 и все еще получал ошибку, что он равен нулю, я попытался отключить внешние ключи, чтобы посмотреть, было ли это проблема и все та же ошибка
Вопрос:
Почему block_index отображается как NULL при выполнении запроса, когда для него установлено значение Some(1) в коде Rust? Как я могу решить эту проблему в Rust с помощью крейта mysql_async?
Я работаю над реализацией блокчейна на Rust, используя MySQL в качестве базы данных. У меня есть две таблицы: блоки и транзакции. Транзакции связываются с блоками через внешний ключ (block_index). [code]```` CREATE TABLE blocks ( block_index BIGINT NOT NULL PRIMARY KEY, previous_hash VARCHAR(255) NOT NULL, block_hash VARCHAR(255) NOT NULL, validator_signature VARCHAR(255) NOT NULL, timestamp DATETIME NOT NULL); [/code] [code] [/code] [code]CREATE TABLE transactions ( transaction_id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, block_index BIGINT NOT NULL, file_hash VARCHAR(255) NOT NULL, uploader_id BIGINT, uploader_name VARCHAR(255) NOT NULL, transaction_checksum VARCHAR(255) NOT NULL, timestamp DATETIME NOT NULL, FOREIGN KEY (block_index) REFERENCES blocks(block_index)); [/code] [code] ````#[derive(Debug, Clone)] pub struct Transaction { pub transaction_id: u64, pub block_index: Option, // Associated block index pub file_hash: String, pub uploader_id: Option, pub uploader_name: String, pub transaction_checksum: String, pub timestamp: chrono::DateTime, } [/code] [code] pub async fn add_transaction( &mut self, transaction: Transaction, pool: &mysql_async::Pool, ) -> Result { if transaction.block_index.is_none() { return Err(mysql_async::Error::Other(Box::new(std::io::Error::new( std::io::ErrorKind::InvalidInput, "Transaction must have a valid block_index", )))); }
Ok(()) } [/code] [code] #[tokio::test] async fn test_add_transaction() { let database_url = "mysql://root:password@localhost:3306/test_public_blockchain"; let pool = mysql_async::Pool::new(database_url);
let mut conn = pool.get_conn().await.unwrap(); conn.exec_drop("DELETE FROM transactions", ()).await.unwrap(); conn.exec_drop("DELETE FROM blocks", ()).await.unwrap();
let mut blockchain = Blockchain::new(Block::new(0, "0".to_string(), vec![], "validator1".to_string()), vec![]); blockchain.add_transaction(transaction.clone(), &pool).await.unwrap(); } [/code] [code] Server(ServerError { code: 1048, message: "Column 'block_index' cannot be null", state: "23000" }) [/code] [code]when I run the test, i get the following error: [/code] Server (ServerError { код: 1048, сообщение: «Столбец 'block_index' не может быть нулевым», состояние: «23000» }) I проверил значение block_index в журналах отладки перед SQL-запросом. Я подтвердил, что Block_index = 1 существует в таблице блоков. Я выполнил запрос вручную, и он работает, когда выполняется напрямую в MySQL Я добавил println! чтобы просмотреть данные перед вставкой данных, чтобы убедиться, что ничего не было нулевым или конкретный индекс_блока не был нулевым, я жестко запрограммировал индекс_блока равным 1 и все еще получал ошибку, что он равен нулю, я попытался отключить внешние ключи, чтобы посмотреть, было ли это проблема и все та же ошибка Вопрос: Почему block_index отображается как NULL при выполнении запроса, когда для него установлено значение Some(1) в коде Rust? Как я могу решить эту проблему в Rust с помощью крейта mysql_async?