Rust: Ошибка SQL-запроса: «Столбец 'block_index' не может быть нулевым» при добавлении транзакцииMySql

Форум по Mysql
Ответить
Anonymous
 Rust: Ошибка SQL-запроса: «Столбец 'block_index' не может быть нулевым» при добавлении транзакции

Сообщение Anonymous »

Я работаю над реализацией блокчейна на Rust, используя MySQL в качестве базы данных. У меня есть две таблицы: блоки и транзакции. Транзакции связываются с блоками через внешний ключ (block_index).

Код: Выделить всё

````
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);

Код: Выделить всё

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));

Код: Выделить всё

````#[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,
}

Код: Выделить всё

    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",
))));
}

let mut conn = pool.get_conn().await?;
conn.exec_drop(
r"INSERT INTO transactions (
transaction_id, block_index, file_hash, uploader_id, uploader_name,
transaction_checksum, timestamp
) VALUES (
:transaction_id, :block_index, :file_hash, :uploader_id, :uploader_name,
:transaction_checksum, :timestamp
)",
mysql_async::params! {
"transaction_id" => transaction.transaction_id,
"block_index" => transaction.block_index.unwrap(),
"file_hash" => transaction.file_hash,
"uploader_id" => transaction.uploader_id,
"uploader_name" => transaction.uploader_name,
"transaction_checksum" => transaction.transaction_checksum,
"timestamp" => transaction.timestamp.to_string(),
},
).await?;

Ok(())
}

Код: Выделить всё

    #[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();

conn.exec_drop(
r"INSERT INTO blocks (block_index, previous_hash, block_hash, validator_signature,
timestamp)
VALUES (1, '0', 'genesis_hash', 'validator1', NOW())",
(),
).await.unwrap();

let transaction = Transaction {
transaction_id: 1,
block_index: Some(1),
file_hash: "test_hash".to_string(),
uploader_id: Some(1),
uploader_name: "Test Uploader".to_string(),
transaction_checksum: "checksum".to_string(),
timestamp: chrono::Utc::now(),
};

let mut blockchain = Blockchain::new(Block::new(0, "0".to_string(), vec![],
"validator1".to_string()), vec![]);
blockchain.add_transaction(transaction.clone(), &pool).await.unwrap();
}

Код: Выделить всё

    Server(ServerError { code: 1048, message: "Column 'block_index' cannot be null", state:
"23000"  })

Код: Выделить всё

when I run the test, i get the following error:
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?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ing-transa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»