Insert an article and fields with db_insert function or SQL
If you need to save a node without invoking any hook, then use the same code node_save() uses, excluding the part invoking hooks.

  $transaction = db_transaction();

  try {
    if (!empty($node-&gt;nid) &amp;&amp; !isset($node-&gt;original)) {
      $node-&gt;original = entity_load_unchanged('node', $node-&gt;nid);
    }

    field_attach_presave('node', $node);
    global $user;

    if (!isset($node-&gt;is_new)) {
      $node-&gt;is_new = empty($node-&gt;nid);
    }

    if (empty($node-&gt;created)) {
      $node-&gt;created = REQUEST_TIME;
    }
    $node-&gt;changed = REQUEST_TIME;
    $node-&gt;timestamp = REQUEST_TIME;
    $update_node = TRUE;

    if ($node-&gt;is_new || !empty($node-&gt;revision)) {
      if (!isset($node-&gt;log)) {
        $node-&gt;log = '';
      }
    }
    elseif (!isset($node-&gt;log) || $node-&gt;log === '') {
      unset($node-&gt;log);
    }

    if (!$node-&gt;is_new &amp;&amp; !empty($node-&gt;revision) &amp;&amp; $node-&gt;vid) {
      $node-&gt;old_vid = $node-&gt;vid;
      unset($node-&gt;vid);
    }

    if ($node-&gt;is_new) {
      drupal_write_record('node', $node);
      _node_save_revision($node, $user-&gt;uid);
      $op = 'insert';
    }
    else {
      drupal_write_record('node', $node, 'nid');
      if (!empty($node-&gt;revision)) {
        _node_save_revision($node, $user-&gt;uid);
      }
      else {
        _node_save_revision($node, $user-&gt;uid, 'vid');
        $update_node = FALSE;
      }
      $op = 'update';
    }
    if ($update_node) {
      db_update('node')-&gt;fields(array('vid' =&gt; $node-&gt;vid))-&gt;condition('nid', $node-&gt;nid)-&gt;execute();
    }

    // Call the node specific callback (if any). This can be
    // node_invoke($node, 'insert') or
    // node_invoke($node, 'update').
    node_invoke($node, $op);

    // Save fields.
    $function = "field_attach_$op";
    $function('node', $node);

    $delete = $op == 'update';
    node_access_acquire_grants($node, $delete);

    unset($node-&gt;is_new);
    unset($node-&gt;original);
    entity_get_controller('node')-&gt;resetCache(array($node-&gt;nid));

    db_ignore_slave();
  }
  catch (Exception $e) {
    $transaction-&gt;rollback();
    watchdog_exception('node', $e);
    throw $e;
  }


I didn't remove the call to node_invoke(), since that calls the hooks implemented by the module implementing the content type, and those hooks are necessary for the content type to work correctly.
I also left the call to db_transaction() because, in the case one of the operations fails, all the operations are rolled back, and the database is left in a consistent state, which means (for example) that every table will refer to the same node version ID.